【思路】先欧拉筛,然后枚举所有四位数的所有排列,最后去重后检验即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include<bits/stdc++.h> using namespace std; const int maxn=10000; int cnt,prime[maxn],a[5],b[5],ans[5]; bool vis[maxn],flag[5]; void euler() { vis[0]=vis[1]=true; for(int i=2;i<=maxn;++i) { if(!vis[i])prime[++prime[0]]=i; for(int j=1;i*prime[j]<=maxn&&j<=prime[0];++j) { vis[i*prime[j]]=true; if(i%prime[j]==0)break; } } } void dfs(int k) { if(k>4) { int x=0; for(int i=1;i<=4;++i)x=x*10+a[b[i]]; if(!vis[x])ans[++cnt]=x; return; } for(int i=1;i<=4;++i) { if(flag[i])continue; b[k]=i; flag[i]=true; dfs(k+1); flag[i]=false; } } int main() { euler(); for(int i=1000;i<10000;++i) { a[1]=i/1000; a[2]=i/100%10; a[3]=i/10%10; a[4]=i%10; if(!a[1]||!a[2]||!a[3]||!a[4])continue; memset(flag,false,sizeof(flag)); cnt=0; dfs(1); sort(ans+1,ans+cnt+1); cnt=unique(ans+1,ans+cnt+1)-ans-1; for(int j=1;j<=cnt;++j) { if(ans[j]==1487)continue; for(int k=j+1;k<=cnt;++k) { for(int l=k+1;l<=cnt;++l) { if(ans[l]-ans[k]==ans[k]-ans[j]) { printf("%d%d%d",ans[j],ans[k],ans[l]); return 0; } } } } } return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<bits/stdc++.h> using namespace std; const int maxn=10000; int cnt,prime[maxn],a[5],ans[5]; bool vis[maxn]; void euler() { vis[0]=vis[1]=true; for(int i=2;i<=maxn;++i) { if(!vis[i])prime[++prime[0]]=i; for(int j=1;i*prime[j]<=maxn&&j<=prime[0];++j) { vis[i*prime[j]]=true; if(i%prime[j]==0)break; } } } int main() { euler(); for(int i=1000;i<10000;++i) { a[1]=i/1000; a[2]=i/100%10; a[3]=i/10%10; a[4]=i%10; if(!a[1]||!a[2]||!a[3]||!a[4])continue; cnt=0; do { int x=0; for(int i=1;i<=4;++i)x=x*10+a[i]; if(!vis[x])ans[++cnt]=x; }while(next_permutation(a+1,a+5)); sort(ans+1,ans+cnt+1); cnt=unique(ans+1,ans+cnt+1)-ans-1; for(int j=1;j<=cnt;++j) { if(ans[j]==1487)continue; for(int k=j+1;k<=cnt;++k) { for(int l=k+1;l<=cnt;++l) { if(ans[l]-ans[k]==ans[k]-ans[j]) { printf("%d%d%d",ans[j],ans[k],ans[l]); return 0; } } } } } return 0; }
|