欧拉筛

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath> 
using namespace std;

const int Max=100010;


bool IsPrime[Max];
int  NumPrime[Max],phi[Max];

int N,Top=0;

int main()
{
    scanf("%d",&N);
    for(int i=1;i<=N;i++) IsPrime[i] = true ;
    IsPrime [1] = false;Top = 0;
    for(int i=2;i<=N;i++)
    {
        if(IsPrime[i]){ NumPrime[++Top] = i;phi[i]=i-1;}
        for(int j=1;j<=Top && i*NumPrime[j]<=N;j++)
        {
            IsPrime[i*NumPrime[j]] = false;
            if(i % NumPrime[j]==0) {
                phi[i * NumPrime[j] ] = NumPrime[j] * phi [i];
                break;
            }
            else phi[ i * NumPrime[j] ] = phi[NumPrime[j]] * phi[i];
        }
    }
    cout<<phi[100]<<endl;
}

 

posted @ 2014-11-05 21:44  endl  阅读(184)  评论(0编辑  收藏  举报