自己辛辛苦苦加了tire树的直接暴力dfs版本的,过了两组。。。看了看题解,先枚举对角线,只要枚举几位,有些就可以确定了。。。写完后,改改越界什么的,各种调之后,终于过了。。。
枚举两天对角线后,再枚举(1,2),(1,3)可得(1,4)枚举(3,2)可得(5,2)枚举(2,3)....反正中间各种细节。。。首位不能为0什么的。
1 /* 2 ID:cuizhe 3 LANG: C++ 4 TASK: prime3 5 */ 6 #include <cstdio> 7 #include <cmath> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 #include <map> 12 using namespace std; 13 #define N 100000 14 struct node 15 { 16 int a[6]; 17 } ans[101]; 18 int t,z,num = 1,tt = 0; 19 int o[N],oo[N]; 20 int flag[N]; 21 int mat[8][8]; 22 int que[10001]; 23 int key[11]; 24 int judge(int flag,int x) 25 { 26 int i,sum = 0; 27 if(flag == 1) 28 { 29 for(i = 1; i <= 5; i ++) 30 sum = sum*10 + mat[x][i]; 31 } 32 else if(flag == 2) 33 { 34 for(i = 1; i <= 5; i ++) 35 sum = sum * 10 + mat[i][x]; 36 } 37 if(oo[sum] == 1) 38 return 1; 39 else 40 return 0; 41 } 42 int cmp(const node &x,const node &y) 43 { 44 int i; 45 for(i = 1;i <= 5;i ++) 46 { 47 if(x.a[i] < y.a[i]) 48 return 1; 49 else if(x.a[i] > y.a[i]) 50 return 0; 51 } 52 return 1; 53 } 54 int main() 55 { 56 57 freopen("prime3.in","r",stdin); 58 freopen("prime3.out","w",stdout); 59 int sum,n,temp,cal,i,j; 60 int i1,i2,i3,i4,i5,i6,i7,i8,i9; 61 for(i = 2; i < 320; i ++) 62 { 63 if(!o[i]) 64 { 65 for(j = i+i; j < N; j += i) 66 { 67 o[j] = 1; 68 } 69 } 70 } 71 scanf("%d%d",&sum,&n); 72 for(i = 10000; i < N; i ++) 73 { 74 if(!o[i]) 75 { 76 cal = 0; 77 temp = i; 78 while(temp) 79 { 80 cal += temp%10; 81 temp /= 10; 82 } 83 if(cal != sum) continue; 84 oo[i] = 1; 85 que[num++] = i; 86 } 87 } 88 for(i1 = 1; i1 < num; i1 ++) 89 { 90 if((que[i1]/10000)%10 == n) 91 { 92 temp = que[i1]; 93 for(i2 = 1; i2 <= 5; i2 ++) 94 { 95 mat[6-i2][6-i2] = temp%10; 96 temp /= 10; 97 } 98 for(i2 = 1; i2 < num; i2 ++) 99 { 100 if((que[i2]/100)%10 == mat[3][3]) 101 { 102 temp = que[i2]; 103 for(i3 = 1; i3 <= 5; i3 ++) 104 { 105 mat[i3][6-i3] = temp%10; 106 temp /= 10; 107 } 108 for(i3 = 1; i3 <= 9; i3 ++) 109 { 110 mat[1][2] = i3; 111 for(i4 = 1; i4 <= 9; i4 ++) 112 { 113 mat[1][3] = i4; 114 mat[1][4] = sum - i3 - i4 - mat[1][1] - mat[1][5]; 115 if(mat[1][4] <= 0||mat[1][4] >= 10) continue; 116 if(!judge(1,1)) continue; 117 for(i5 = 0; i5 <= 9; i5 ++) 118 { 119 mat[3][2] = i5; 120 mat[5][2] = sum - i5 - mat[1][2] - mat[2][2] - mat[4][2]; 121 if(mat[5][2] < 0||mat[5][2] >= 10) continue; 122 if(!judge(2,2)) continue; 123 for(i6 = 0; i6 <= 9; i6 ++) 124 { 125 mat[2][3] = i6; 126 for(i7 = 0; i7 <= 9; i7 ++) 127 { 128 mat[3][4] = i7; 129 mat[5][4] = sum - mat[1][4] - mat[2][4]- mat[3][4]- mat[4][4]; 130 if(mat[5][4] < 0||mat[5][4] >= 10) continue; 131 if(!judge(2,4)) continue; 132 mat[5][3] = sum - mat[5][1] - mat[5][2] - mat[5][4] - mat[5][5]; 133 if(mat[5][3] < 0||mat[5][3] >= 10) continue; 134 if(!judge(1,5)) continue; 135 mat[4][3] = sum - mat[1][3] - mat[2][3] - mat[3][3] - mat[5][3]; 136 if(mat[4][3] < 0||mat[4][3] >= 10) continue; 137 if(!judge(2,3)) continue; 138 for(i8 = 1; i8 <= 9; i8 ++) 139 { 140 mat[2][1] = i8; 141 mat[2][5] = sum - mat[2][1] - mat[2][2] - mat[2][3] - mat[2][4]; 142 if(mat[2][5] < 0||mat[2][5] >= 10) continue; 143 if(!judge(1,2)) continue; 144 for(i9 = 1; i9 <= 9; i9 ++) 145 { 146 mat[3][1] = i9; 147 mat[3][5] = sum - mat[3][1] - mat[3][2] - mat[3][3] - mat[3][4]; 148 mat[4][5] = sum - mat[1][5] - mat[2][5] - mat[3][5] - mat[5][5]; 149 mat[4][1] = sum - mat[4][2] - mat[4][3] - mat[4][4] - mat[4][5]; 150 temp = sum - mat[1][1] - mat[2][1] - mat[3][1] - mat[5][1]; 151 if(temp != mat[4][1]) continue; 152 if(mat[3][5] < 0||mat[3][5] >= 10) continue; 153 if(mat[4][5] < 0||mat[4][5] >= 10) continue; 154 if(mat[4][1] <= 0||mat[4][1] >= 10) continue; 155 if(!judge(1,3)) continue; 156 if(!judge(1,4)) continue; 157 if(!judge(2,1)) continue; 158 if(!judge(2,5)) continue; 159 z = 1; 160 for(i = 1; i <= 5; i ++) 161 { 162 temp = 0; 163 for(j = 1; j <= 5; j ++) 164 temp = temp*10 + mat[i][j]; 165 ans[tt].a[i] = temp; 166 } 167 tt ++; 168 } 169 } 170 } 171 } 172 } 173 } 174 } 175 } 176 } 177 } 178 } 179 sort(ans,ans+tt,cmp); 180 for(i = 0; i < tt; i ++) 181 { 182 if(i != 0) 183 printf("\n"); 184 for(j = 1; j <= 5; j ++) 185 printf("%d\n",ans[i].a[j]); 186 } 187 if(!z) printf("NONE\n"); 188 return 0; 189 }