标签:tar void signed space using div namespace its turn
枚举每一位放数字还是放未知的,如果为止的就拿1代替单独存
因为要有8个,所以我们可知未知的一定是三的倍数,末尾一定是1,3,7,然后暴力搞一搞(剪枝跑得飞快)
1 #include<bits/stdc++.h> 2 #define reg register 3 #define int long long 4 using namespace std; 5 int last[3]={1,3,7}; 6 bool check(int x){//判断素数 7 if(x==1||(x%6!=1&&x%6!=5)) 8 return 0; 9 if(x==2||x==3)return 1; 10 int MAX=sqrt(x); 11 for(int i=5;i<=MAX;i+=6) 12 if(x%i==0||x%(i+2)==0) 13 return 0; 14 return 1; 15 } 16 void dfs(int k,int unknow,int know,int rest){//第几位 未知的放的位置 已知的 还剩几个未知的 17 if(k-1<rest)return;//最后一位不放未知的 18 if(k==1){ 19 for(int p=0;p<3;p++){//枚举最后一位 20 int f=0,ans=0; 21 for(reg int i=0;i<=9;i++) 22 if(check((know+unknow*i)*10+last[p])){ 23 if(unknow>know&&i==0)ans--; 24 ans++; 25 if(!f)f=(know+unknow*i)*10+last[p]; 26 if(ans+(9-i)<8)break; //如果剩下全是还没有8个就退出 27 } 28 if(ans==8){//输出答案 29 printf("%d\n",f); 30 exit(0); 31 } 32 f=0,ans=0; 33 } 34 return; 35 } 36 for(reg int i=0;i<=9;i++) 37 dfs(k-1,unknow*10,know*10+i,rest);//继续搜索 38 dfs(k-1,unknow*10+1,know*10,rest-1); 39 return; 40 } 41 signed main(){ 42 for(reg int k=1;;k++){ 43 for(reg int l=3;l<k;l+=3) 44 dfs(k,0,0,l); 45 } 46 return 0; 47 }
标签:tar void signed space using div namespace its turn
原文地址:https://www.cnblogs.com/hualian/p/13841495.html