PE 49
Posted ygxcj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PE 49相关的知识,希望对你有一定的参考价值。
题意:1487, 4817, 8147是公差为3330的等差数列,并且三个数都是质数、构成这三个数的数都是一样的。求出另一个满足条件的四位数。
思路:先将4位数的质数找出来,然后分解,重新排列,找到由这几个数构成的所有质数,然后判断是否有满足条件的。可以用vis数组判断这个数是否已经构造过。

#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn=1e7; int v[maxn]; struct Prime { int prime[maxn]; int s; Prime() { for(int i=2; i<maxn; i++) { if(!v[i]) { prime[s++]=i; for(int j=2; j*i<maxn; j++) v[i*j]=1; } } } }; Prime p; int vis[maxn]; void check(int c) { int a[4]; int k=0; while(c) { a[k++]=c%10; c/=10; } sort(a,a+4); int b[50]; set<int>st; int s=0; do { k=a[0]*1000+a[1]*100+a[2]*10+a[3]; if(k<1000||v[k]) continue; b[s++]=k; vis[k]=1; st.insert(k); } while(next_permutation(a,a+4)); sort(b,b+s); for(int i=0; i<s-2; i++) for(int j=i+1; j<s; j++) { if(v[2*b[j]-b[i]]||!st.count(2*b[j]-b[i])) continue; cout<<b[i]<<" "<<b[j]<<" "<<2*b[j]-b[i]<<endl; return ; } } int main() { for(ll i=1000; i<9999; i++) { if(!v[i]&&!vis[i]) check(i); } return 0; }
以上是关于PE 49的主要内容,如果未能解决你的问题,请参考以下文章