欧拉线筛效率高(建议背代码),
时间复杂度接近O(n),常数不大,田野大神说可以忽略。优点还在于可以同时求出phi,
这样效率极高算法导论p553写了一些
在洛谷P1579 哥德巴赫猜想(升级版)用到了
新账号里
那题代码
#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<map> #include<cstring> #define MAXN 10007 using namespace std; int vis[MAXN*2]={0},prime[MAXN]={0},phi[MAXN*2]={0}; map<int,int>m; int cnt; void Prime(int n) { cnt=0; memset(vis,0,sizeof(vis)); for (int i=2;i<=n;i++) { if (!vis[i]) prime[++cnt]=i,phi[i]=i-1; for (int j=1;j<=cnt&&i*prime[j]<=n;j++) { int k=i*prime[j]; vis[k]=1; if (i%prime[j]==0) { phi[k]=prime[j]*phi[i]; break; } else phi[k]=(prime[j]-1)*phi[i]; } } for (int i=1;i<=cnt;i++) m[prime[i]]++; } int main() { int n; scanf("%d",&n); m.clear(); Prime(n); for (int i=1;i<=cnt;i++) for (int j=1;j<=cnt;j++) if (m[n-prime[i]-prime[j]]) { cout<<prime[i]<<" "<<prime[j]<<" "<<n-prime[i]-prime[j]; return 0; } }