质数方阵
先筛质数
开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<int> vec[11][11][11][11][11];
bitset<MAXN> vis;
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<vec[i][j][k][l][m].size();++n){
int tmp=vec[i][j][k][l][m][n];
vec[i][j][k][l][10].push_back(tmp);
vec[i][j][k][10][m].push_back(tmp);
vec[i][j][10][l][m].push_back(tmp);
vec[i][10][k][l][m].push_back(tmp);
vec[10][j][k][l][m].push_back(tmp);
vec[i][j][k][10][10].push_back(tmp);
vec[i][j][10][l][10].push_back(tmp);
vec[i][10][k][l][10].push_back(tmp);
vec[10][j][k][l][10].push_back(tmp);
vec[i][j][10][10][m].push_back(tmp);
vec[i][10][k][10][m].push_back(tmp);
vec[10][j][k][10][m].push_back(tmp);
vec[i][10][10][l][m].push_back(tmp);
vec[10][j][10][l][m].push_back(tmp);
vec[10][10][k][l][m].push_back(tmp);
vec[i][j][10][10][10].push_back(tmp);
vec[i][10][k][10][10].push_back(tmp);
vec[10][j][k][10][10].push_back(tmp);
vec[i][10][10][l][10].push_back(tmp);
vec[10][j][10][l][10].push_back(tmp);
vec[10][10][k][l][10].push_back(tmp);
vec[i][10][10][10][m].push_back(tmp);
vec[10][j][10][10][m].push_back(tmp);
vec[10][10][k][10][m].push_back(tmp);
vec[10][10][10][l][m].push_back(tmp);
vec[i][10][10][10][10].push_back(tmp);
vec[10][j][10][10][10].push_back(tmp);
vec[10][10][k][10][10].push_back(tmp);
vec[10][10][10][l][10].push_back(tmp);
vec[10][10][10][10][m].push_back(tmp);
vec[10][10][10][10][10].push_back(tmp);
}
}
}
}
}
}return;
}
void solve()
{
for(int i=0;i<vec[c][10][10][10][10].size();++i){//第一行
for(int j=1;j<=5;++j) b.v[1][j]=get(vec[c][10][10][10][10][i],6-j);
for(int j=0;j<vec[c][10][10][10][10].size();++j){//第一列
for(int k=1;k<=5;++k) b.v[k][1]=get(vec[c][10][10][10][10][j],6-k);
for(int k=0;k<vec[c][10][10][10][10].size();++k){//左上右下对角线
for(int l=1;l<=5;++l) b.v[l][l]=get(vec[c][10][10][10][10][k],6-l);
for(int l=0;l<vec[b.v[5][1]][10][b.v[3][3]][10][b.v[1][5]].size();++l){//左下右上对角线
b.v[4][2]=get(vec[b.v[5][1]][10][b.v[3][3]][10][b.v[1][5]][l],4);
b.v[2][4]=get(vec[b.v[5][1]][10][b.v[3][3]][10][b.v[1][5]][l],2);
for(int m=0;m<vec[b.v[2][1]][b.v[2][2]][10][b.v[2][4]][10].size();++m){//第二行
b.v[2][3]=get(vec[b.v[2][1]][b.v[2][2]][10][b.v[2][4]][10][m],3);
b.v[2][5]=get(vec[b.v[2][1]][b.v[2][2]][10][b.v[2][4]][10][m],1);
for(int n=0;n<vec[b.v[1][5]][b.v[2][5]][10][10][b.v[5][5]].size();++n){//第五列
b.v[3][5]=get(vec[b.v[1][5]][b.v[2][5]][10][10][b.v[5][5]][n],3);
b.v[4][5]=get(vec[b.v[1][5]][b.v[2][5]][10][10][b.v[5][5]][n],2);
for(int o=0;o<vec[b.v[4][1]][b.v[4][2]][10][b.v[4][4]][b.v[4][5]].size();++o){//第四行
b.v[4][3]=get(vec[b.v[4][1]][b.v[4][2]][10][b.v[4][4]][b.v[4][5]][o],3);
for(int p=0;p<vec[b.v[1][3]][b.v[2][3]][b.v[3][3]][b.v[4][3]][10].size();++p){//第三列
b.v[5][3]=get(vec[b.v[1][3]][b.v[2][3]][b.v[3][3]][b.v[4][3]][10][p],1);
for(int q=0;q<vec[b.v[3][1]][10][b.v[3][3]][10][b.v[3][5]].size();++q){//第三行
b.v[3][2]=get(vec[b.v[3][1]][10][b.v[3][3]][10][b.v[3][5]][q],4);
b.v[3][4]=get(vec[b.v[3][1]][10][b.v[3][3]][10][b.v[3][5]][q],2);
for(int r=0;r<vec[b.v[1][2]][b.v[2][2]][b.v[3][2]][b.v[4][2]][10].size();++r){//第二列
b.v[5][2]=get(vec[b.v[1][2]][b.v[2][2]][b.v[3][2]][b.v[4][2]][10][r],1);
for(int s=0;s<vec[b.v[1][4]][b.v[2][4]][b.v[3][4]][b.v[4][4]][10].size();++s){//第四列
b.v[5][4]=get(vec[b.v[1][4]][b.v[2][4]][b.v[3][4]][b.v[4][4]][10][s],1);
for(int t=0;t<vec[b.v[5][1]][b.v[5][2]][b.v[5][3]][b.v[5][4]][b.v[5][5]].size();++t){//第五行
a[++cnt]=b;
}
}
}
}
}
}
}
}
}
}
}
}return;
}
bool cmp(rpg a,rpg b)
{
for(int i=1;i<=5;++i){
for(int j=1;j<=5;++j){
if(a.v[i][j]<b.v[i][j]) return 1;
if(a.v[i][j]>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;
}
用先进的科学技术与思想文化武装起来的人民,是一个国家最巨大的生产力,是一个社会最强大的推动力,是一个民族最坚实的自信力,是一支军队最可靠的战斗力。
——A·H