天天看点

poj2478~欧拉公式套模板

poj2478~欧拉公式套模板
#include<iostream>
#include<string>
#include<cmath>
#define M 1000005    
using namespace std;

int prime[M];
long long ans[M];

int main()
{
    int i,j,k;
    prime[0] = 0;
    prime[1] = 0;
    for(i=2;i<M;i++)
        prime[i] = 1;
    for(i=2;i*i<=M;i++)       //构建素数表
    {
        if(prime[i])
        {
            for(j=i*i;j<=M;j+=i)
                prime[j] = 0;
        }
    }        
    for(i=1;i<=M;i++)
    {
        ans[i] = i;
    }
    for(i=2;i<=M;i++)
    {
        if(prime[i])        //ans[x]等于   x有很多质因数p,将p都进行这样的运算x/p*(p-1);
        {
            for(j=i;j<M;j+=i)     //既满足素数又满足是因数
                ans[j]=(ans[j]/i)*(i-1);
        }
    }
    for(i=3;i<=M;i++)
        ans[i]+=ans[i-1];
    while(scanf("%d",&k),k)
    {
        printf("%lld\n",ans[k]);
    }
}