这个链接,可以看下。
参考链接:
P2232 [HNOI2002] 填数游戏 题解 - 洛谷专栏
https://www.luogu.com.cn/article/avxe1prw
using namespace std;
const int N=22+32;
long long r0[N],r1[N];
int primes[N]= {3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,
59,61,67,71,73,79,83,89,97,101,103,107,109,113,127
};
void manage(int n,int m) {
for(int i=0; i<n; ++i)r0[i]=primes[i];
if(n%2==0)r0[0]<<=1;
for(int i=0; i<m; ++i)r1[i]=primes[i+n];
if(m%2==0)r1[0]<<=1;
}
void generate(long long* rw,int n,long long tmp=0) {
for(int i=0; i<n; ++i)tmp+=sqr(rw[i]);
rw[n]=(tmp-1)/2;
for(int j=3; j<100; j+=2)if((tmp/j>rw[n-1]*2+j)&&(tmp-j*j)%(2*j)==0)rw[n]=(tmp-j*j)/2/j;
}
int main() {
// https://www.luogu.com.cn/article/avxe1prw
// freopen("testdata.in","w",stdout);printf("%d %d\n",n,m);
int n,m;
scanf("%d%d",&n,&m);
int swap=0;if(n<m)n^=m^=n^=m,swap=1;if(n==11&&m==6)swap^=1,n^=m^=n^=m;
manage(n-1,m-1);
generate(r0,n-1);
generate(r1,m-1);
if(swap)n^=m^=n^=m;
for(int i=0; i<n; ++i)for(int j=0; j<m; ++j) {
// printf("%lld",swap?sqr(r1[i]*r0[j]):sqr(r0[i]*r1[j]));
printf("%lld",swap?sqr(r1[i]*r0[j]):sqr(r0[i]*r1[j]));
printf((j+1==m)?"\n":" ");
}
}
