AGC027D Modulo Matrix

First Post:

Last Update:

Word Count:
413

Read Time:
1 min

Page View: loading...

题意

构造 矩阵,元素互不相同且小于 ,所有相邻两个数字的 相等,且不等于零。

思路

不妨假定每个数要么大于相邻的四个数,要么小于相邻的四个数。

这样整张图构成一个网状结构:

这样可以使得 ,然后只要蓝色格全部 即可。

这样,我们就需要蓝色格是周围黑色格的 ,接下来只需考虑黑色格如何互不相同并且让蓝色格尽可能小。

可以对于同一斜线上的黑色格赋予同一种质数,由于每个黑色格在两条不同方向的斜线上,这样只需 的质数就能得到 的数量,并且这样每个蓝色格周围只会有 种质数,只需要避免两个方向上最大的质数取 即可保证小于

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);
}