正题
题目链接:https://atcoder.jp/contests/agc027/tasks/agc027_d
题目大意
n∗nn*nn∗n的网格,每个格子填一个数要求
- 所有数各不相同
- 对于相邻的两个数ax,aya_x,a_yax,ay,max{ax,ay}%min{ax,ay}max\{a_x,a_y\}\%min\{a_x,a_y\}max{ax,ay}%min{ax,ay}相同
- 数的大小不超过101510^{15}1015
解题思路
我们对与每一个斜角线都定义一个不相同的质数,然后在两个斜对角的位置就是两个质数的乘积。
对与剩下的格子填四周数的lcm+1lcm+1lcm+1即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,pri[110000],cnt,a[510][510];
bool v[110000];
ll lcm(ll x,ll y){if(!x||!y)return x+y;return x/__gcd(x,y)*y;
}
int main()
{scanf("%lld",&n);if(n==2)return printf("4 7\n23 10")&0;for(ll i=2;i<=10000;i++){if(!v[i])pri[++cnt]=i;for(ll j=1;j<=cnt&&i*pri[j]<=10000;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;}}for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)if(!((i+j)&1))a[i][j]=pri[(i+j)/2]*pri[n+(n+1)/2+(i-j)/2];for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)if((i+j)&1)a[i][j]=lcm(lcm(a[i-1][j],a[i+1][j]),lcm(a[i][j+1],a[i][j-1]))+1ll;for(ll i=1;i<=n;i++,putchar('\n'))for(ll j=1;j<=n;j++)printf("%lld ",a[i][j]);
}