codechef: ADAROKS2 ,Ada Rooks 2

又是道原題... (HDU 6313 Hack It , 多校 ACM 裏面的題)php

題目說構造一個 n * n 矩陣,染色點不得構成矩形...而後染色點個數至少 8 * nios

而後咱們生成一個數 m ,把矩陣分紅 m * m 塊 ,每塊每行都至少要有 1 個 1 ,具體構造看代碼:git

fp(i,0,m-1) fp(j,0,m-1) fp(k,0,m-1)
        s[m*i+j][m*k+(j*k+i)%m]=1;

證實的話要用循環加羣...具體證實能夠康這裏spa

總的來講就是抄 hdu ACM 上那題的代碼就行了(玄學的構造法),要注意的就是 m 取值要是個質數,而且數字要足夠大,因此要先篩出 1~100 的 質數就是了(我竟然在質數上調了這麼久).net

//by Judge
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
using namespace std;
const int M=1003;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){ int x=0,f=1; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int C=-1,Z;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
int n,m,s[M][M];
inline void check(int n){ Rg int num=0;
    fp(i,1,n) fp(j,1,n) num+=s[i][j];
    if(num<n*8) return puts("Error"),void();
    fp(r1,1,n) fp(r2,r1+1,n)
        fp(c1,1,n) fp(c2,c1+1,n)
            if(s[r1][c1]&&s[r2][c1]&&s[r1][c2]&&s[r2][c2])
                return printf("%d , %d -> %d , %d\n",r1,c1,r2,c2),void();
    puts("win");
}
int cnt; arr p,vis;
inline void prep(Rg int n){ vis[1]=1;
    fp(i,2,n){ if(!vis[i]) p[++cnt]=i;
        for(Rg int j=1;j<=cnt&&p[j]*i<=n;++j){
            vis[i*p[j]]=1; if(!(i%p[j])) break;
        }
    }
}
int main(){ prep(100);
    fp(stp,1,read()){ n=read(),m=sqrt(n);
        while(vis[m]) ++m;
        fp(i,0,n-1) fp(j,0,n-1) s[i][j]=0;
        fp(i,0,m-1) fp(j,0,m-1) fp(k,0,m-1)
            s[m*i+j][m*k+(j*k+i)%m]=1;
        fp(i,0,n-1){
            fp(j,0,n-1) sr[++C]=s[i][j]?'O':'.';
            sr[++C]='\n';
            if(C>1<<20) Ot();
        }
    } return Ot(),0;
}
相關文章
相關標籤/搜索