关于欧拉线筛

欧拉线筛效率高(建议背代码),

时间复杂度接近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;
            }
}

 

posted @ 2017-04-19 21:20  Kaiser-  阅读(332)  评论(0编辑  收藏  举报