先筛质数
开vector
存满足某种状态且各数位和合法的质数
然后先填第一行、第一列、第一对角线
继续填,先填约束多的,再填约束少的
复杂度非常可观~就是代码有点长~
#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"#include"vector"#include"bitset"using namespace std;const int MAXN=1e5+5;int sum,c,cnt;int pw[5],p[MAXN];vector vec[11][11][11][11][11];bitsetvis;struct rpg{ int v[6][6]; void write() { for(int i=1;i<=5;++i){ for(int j=1;j<=5;++j){ printf("%d",v[i][j]); }puts(""); }return; }}b,a[505];int get(int x,int v){return x/pw[v-1]%10;}void init(){ scanf("%d%d",&sum,&c);pw[0]=1;for(int i=1;i<=4;++i) pw[i]=pw[i-1]*10; for(int i=2;i<=1e5;++i){ if(!vis[i]) p[++p[0]]=i; for(int j=1;j<=p[0]&&i*p[j]<=1e5;++j){ vis[i*p[j]]=1; if(!(i%p[j])) break; } }for(int i=1;i<=p[0];++i){ if(p[i]<1e4) continue; int tmp1=get(p[i],5),tmp2=get(p[i],4),tmp3=get(p[i],3),tmp4=get(p[i],2),tmp5=get(p[i],1); if(tmp1+tmp2+tmp3+tmp4+tmp5!=sum) continue; vec[tmp1][tmp2][tmp3][tmp4][tmp5].push_back(p[i]); }for(int i=1;i<=9;++i){ for(int j=0;j<=9;++j){ for(int k=0;k<=9;++k){ for(int l=0;l<=9;++l){ for(int m=1;m<=9;m+=2){ for(int n=0;n b.v[i][j]) return 0; } }return 0;}void write(){ if(!cnt){puts("NONE");return;} sort(a+1,a+cnt+1,cmp);a[1].write(); for(int i=2;i<=cnt;++i) puts(""),a[i].write(); return;}int main(){ init(); solve(); write(); return 0;}