题意
构造 矩阵,元素互不相同且小于 ,所有相邻两个数字的 相等,且不等于零。
思路
不妨假定每个数要么大于相邻的四个数,要么小于相邻的四个数。
这样整张图构成一个网状结构:
这样可以使得 ,然后只要蓝色格全部 即可。
这样,我们就需要蓝色格是周围黑色格的 ,接下来只需考虑黑色格如何互不相同并且让蓝色格尽可能小。
可以对于同一斜线上的黑色格赋予同一种质数,由于每个黑色格在两条不同方向的斜线上,这样只需 的质数就能得到 的数量,并且这样每个蓝色格周围只会有 种质数,只需要避免两个方向上最大的质数取 即可保证小于 。
CODE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<cstdio> using namespace std; const int N=20010,FSIZE=1<<26; int n,pr[N]; bool no[N]; char BuF[FSIZE],*InF=BuF; template<typename T>void read(T &x){ for(;48>*InF||*InF>57;++InF); for(x=0;47<*InF&&*InF<58;x=x*10+(*InF++^48)); } int main(){ fread(BuF,1,FSIZE,stdin); read(n); for(int i=2,cnt=0;cnt<N;++i){ if(!no[i]) pr[cnt++]=i; for(int j=0;j<cnt&&i*pr[j]<N;++j){ no[i*pr[j]]=1; if(!(i%pr[j])) break; } } for(int i=1;i<=n;++i,puts("")) for(int j=1;j<=n;++j) printf("%lld ",(i^j)&1? (long long) pr[(i+j-2)>>1]*pr[n+((i-j)>>1)]* pr[(i+j)>>1]*pr[n+((i-j-2)>>1)]+1: pr[(i+j-1)>>1]*pr[n+((i-j-1)>>1)]); fclose(stdin); fclose(stdout); return(0); }
|