#10024 「一本通 1.3 练习 3」质数方阵

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/violinlove/article/details/82860604

暴力搜索,,,

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

inline int wread(){
    char c=getchar ();int flag=1,wans=0;
    while (c<'0'||c>'9'){if (c=='-') flag=-1;c=getchar ();}
    while (c>='0'&&c<='9'){wans=wans*10+c-'0';c=getchar ();}
    return wans*=flag;
}

int n,m;
bool jud[100009];
int Pri[100009],topp;
int Lin[7];
int cnt2[11][9002],top2[11];
//       3
int cnt34[11][11][1002],top34[11][11];
//       1    5 
int cnt56[11][11][11][11][11],top56[11][11][11][11];
//        1   2   4   5 
int cnt7[11][11][11][102],top7[11][11][11];
//       2    3   4
int cnt8910[11][11][11][102],top8910[11][11][11];
//       1    3  5  
int cnt[11][11][11][11][11];

int beg[9005][6],topb,begnum[9005];

int sav[6][6];
bool F;

int ans;

struct node {int s1,s2,s3,s4,s5;}pr[10006];

bool e666 (node x,node y){
	if (x.s1==y.s1)	{
		if (x.s2==y.s2){
			if (x.s3==y.s3){
				if (x.s4==y.s4){
					return x.s5<y.s5;
				}
				else return x.s4<y.s4;
			}
			else return x.s3<y.s3;
		}
		else return x.s2<y.s2;
	}
	else return x.s1<y.s1;
}

void dfs (int stp){
    if (stp==2){
        for (int i=1;i<=top2[sav[3][3]];++i){
            int nx(cnt2[sav[3][3]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]);swap(Lin[2],Lin[4]);
            sav[5][1]=Lin[1];sav[4][2]=Lin[2];sav[2][4]=Lin[4];sav[1][5]=Lin[5];
            dfs(3);
        }
        return ;
    }
    else if (stp==3){
        for (int i=1; i<=top34[sav[1][1]][sav[5][1]]; ++i){
            int nx(cnt34[sav[1][1]][sav[5][1]][i]);
//                      printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]); swap(Lin[2],Lin[4]);
            sav[2][1]=Lin[2];sav[3][1]=Lin[3];sav[4][1]=Lin[4];
            dfs(4);
        }
        return ;
    }
    else if (stp==4){
        for (int i=1; i<=top34[sav[1][5]][sav[5][5]]; ++i){
            int nx(cnt34[sav[1][5]][sav[5][5]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]); swap(Lin[2],Lin[4]);
            sav[2][5]=Lin[2];sav[3][5]=Lin[3];sav[4][5]=Lin[4];
            dfs(5);
        }
        return ;
    }
    else if (stp==5){
        for (int i=1; i<=top56[sav[2][1]][sav[2][2]][sav[2][4]][sav[2][5]]; ++i){
            int nx(cnt56[sav[2][1]][sav[2][2]][sav[2][4]][sav[2][5]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            sav[2][3]=Lin[3];
            dfs(6);
        }
        return ;
    }
    else if (stp==6){
        for (int i=1; i<=top56[sav[4][1]][sav[4][2]][sav[4][4]][sav[4][5]]; ++i){
            int nx(cnt56[sav[4][1]][sav[4][2]][sav[4][4]][sav[4][5]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            sav[4][3]=Lin[3];
            dfs(7);
        }
        return ;
    }
    else if (stp==7){
        for (int i=1; i<=top7[sav[2][3]][sav[3][3]][sav[4][3]]; ++i){
            int nx(cnt7[sav[2][3]][sav[3][3]][sav[4][3]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]); swap(Lin[2],Lin[4]);
            sav[1][3]=Lin[1];sav[5][3]=Lin[5];
            dfs(8);
        }
        return ;
    }
    else if (stp==8){
        for (int i=1; i<=top8910[sav[1][1]][sav[1][3]][sav[1][5]]; ++i){
            int nx(cnt8910[sav[1][1]][sav[1][3]][sav[1][5]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]); swap(Lin[2],Lin[4]);
            sav[1][2]=Lin[2];sav[1][4]=Lin[4];
            dfs(9);
        }
        return ;
    }
    else if (stp==9){
        for (int i=1; i<=top8910[sav[3][1]][sav[3][3]][sav[3][5]]; ++i){
            int nx(cnt8910[sav[3][1]][sav[3][3]][sav[3][5]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]); swap(Lin[2],Lin[4]);
            sav[3][2]=Lin[2];sav[3][4]=Lin[4];
            dfs(10);
        }
        return ;
    }
    else if (stp==10){
        for (int i=1; i<=top8910[sav[5][1]][sav[5][3]][sav[5][5]]; ++i){
            int nx(cnt8910[sav[5][1]][sav[5][3]][sav[5][5]][i]);
//          printf("%d\n",nx);
//          system ("pause");
            int lintop(0);
            while (nx){
                lintop++;
                Lin[lintop]=nx%10;
                nx/=10;
            }
            swap (Lin[1],Lin[5]); swap(Lin[2],Lin[4]);
            sav[5][2]=Lin[2];sav[5][4]=Lin[4];
            dfs(11);
        }
        return ;
    }
    else if (stp==11){
        for (int i=1;i<=5;++i)
            if (cnt[sav[i][1]][sav[i][2]][sav[i][3]][sav[i][4]][sav[i][5]]==-1) return ;
        for (int i=1;i<=5;++i)
            if (cnt[sav[1][i]][sav[2][i]][sav[3][i]][sav[4][i]][sav[5][i]]==-1) return ;
        ++ans;
        int s1(0),s2(0),s3(0),s4(0),s5(0);
        for (int i=1;i<=5;++i){
        	for (int j=1;j<=5;++j){
        		if (i==1)
        			s1+=sav[i][j]*pow(10,5-j);
				else if (i==2)
					s2+=sav[i][j]*pow(10,5-j);
				else if (i==3)
					s3+=sav[i][j]*pow(10,5-j);
				else if (i==4)
					s4+=sav[i][j]*pow(10,5-j);
				else if (i==5)
					s5+=sav[i][j]*pow(10,5-j);
			}
		}
		pr[ans]=(node){s1,s2,s3,s4,s5};
    }
    return ;
}

void clear_mem(){
    memset (cnt,-1,sizeof cnt);

}
int main (){
    n=wread();m=wread();
    memset (jud,true,sizeof jud);
    jud[1]=false;
    for (int i(2);i<=99999;++i){
        if (jud[i]) Pri[++topp]=i;
        for (int j(1);j<=topp && Pri[j]*i<=99999;++j){
            jud[Pri[j]*i]=false;
            if (i%Pri[j]==0)    break;
        }
    }
    clear_mem();

    for (int i=10000;i<=99999;++i){
        if (jud[i]) {
            int nx=i;
            int lintop(0);
            int sum(0);
            while (nx){
                ++lintop;
                Lin[lintop]=nx%10;
                sum+=Lin[lintop];
                nx/=10;
            }
            if (sum!=n) {jud[i]=false;continue;}
            swap(Lin[1],Lin[5]);swap(Lin[2],Lin[4]);
//          printf("%d   ",i);
//          for (int j=1;j<=5;++j){
//              printf("%d",Lin[j]);
//          }puts("");
//          system ("pause");
            cnt2[Lin[3]][++top2[Lin[3]]]=i;
            cnt34[Lin[1]][Lin[5]][++top34[Lin[1]][Lin[5]]]=i;
            cnt56[Lin[1]][Lin[2]][Lin[4]][Lin[5]][++top56[Lin[1]][Lin[2]][Lin[4]][Lin[5]]]=i;
            cnt7[Lin[2]][Lin[3]][Lin[4]][++top7[Lin[2]][Lin[3]][Lin[4]]]=i;
            cnt8910[Lin[1]][Lin[3]][Lin[5]][++top8910[Lin[1]][Lin[3]][Lin[5]]]=i;
            cnt[Lin[1]][Lin[2]][Lin[3]][Lin[4]][Lin[5]]=i;
            ++topb;
            for (int j(1);j<=5;++j)
                beg[topb][j]=Lin[j];
            begnum[topb]=i;
        }
    }


    for (int A(1);A<=topb;++A){
        memset (sav,0,sizeof sav);
        sav[1][1]=beg[A][1];
        if (sav[1][1]<m)	continue;
        if (sav[1][1]>m)    break;
        sav[2][2]=beg[A][2];
        sav[3][3]=beg[A][3];
        sav[4][4]=beg[A][4];
        sav[5][5]=beg[A][5];
        F=true;
        dfs (2);
    }
//	for (int i=1;i<=ans;++i){
//		printf("%d %d %d %d %d\n",pr[i].s1,pr[i].s2,pr[i].s3,pr[i].s4,pr[i].s5);
//	}
	if (!ans){
		puts("NONE");return 0;
	}
	sort(pr+1,pr+ans+1,e666);
	for (int i=1;i<=ans;++i){
		printf("%d\n%d\n%d\n%d\n%d\n",pr[i].s1,pr[i].s2,pr[i].s3,pr[i].s4,pr[i].s5);
		puts("");
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/violinlove/article/details/82860604