题目链接
题意
求一个行列均为n的矩阵,矩阵中每个数均不为素数,但每行和每列的和均为素数。
思路
观察第二个样例想到(心想900分的题必然简单233):1不是素数,那么试试全为1。然后发现如果n为素数,全为1可行,但如果n不为素数,那么就需要把某一行的一个1变为另一个合数。
代码
#include<stdio.h>
const int N = 200;
bool vis[N];
bool viss[N];//存某数是否为素数(是为1,不是为0)
int p[N];//存素数
int t,n;
int main() {
int k=0;
for(int i=2; i<N; i++) {
if(vis[i]==0) {
p[k++]=i;
viss[i]=1;
}
for(int j=i; j<N; j+=i)
vis[j]=1;
}//埃式筛法筛素数
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
int i;
for(i=0; i<k; i++)
if(p[i]>=n&&viss[p[i]-n+1]==0)
break;//若素数p[i]大于n,且p[i]减去(n-1)不是素数,则p[i]即每行中那个不是1的数
int ans=p[i]-n+1;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++)
if(i==j) printf("%d ",ans);
else printf("1 ");
printf("\n");
}
}
return 0;
}