码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉之路

时间:2020-10-19 22:57:02      阅读:18      评论:0      收藏:0      [点我收藏+]

标签:tar   void   signed   space   using   div   namespace   its   turn   

Prime digit replacements

技术图片

 

 枚举每一位放数字还是放未知的,如果为止的就拿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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!