Poj2478

线性素数筛求欧拉函数,再求欧拉函数的和

#include <iostream>

#include <stdio.h>

using namespace std;

 

const int MAX=1000000;

 

long long sum[MAX+10];

bool prime[MAX+10];

long long phi[MAX+10];

void getprime()

{

int i,j;

prime[0]=prime[1]=0;

for(i=2;i<=MAX;i++)

prime[i]=1;

for(i=2;i*i<=MAX;i++)

if(prime[i])

for(j=i*i;j<=MAX;j+=i)

prime[j]=0;

}

void eu()

{

int i,j;

for(i=1;i<=MAX;i++)

phi[i]=i;

for(i=2;i<=MAX;i++)

{

if(prime[i])

for(j=i;j<=MAX;j+=i)

phi[j]=phi[j]/i*(i-1);

}

}

 

int main()

{

int n;

getprime();

eu();

sum[2]=1;

for(int i=3;i<=MAX;i++)

sum[i]=sum[i-1]+phi[i];

freopen("in.txt","r",stdin);

while(scanf("%d",&n)!=EOF)

{

if(n==0)

break;

else

printf("%lld\n",sum[n]);

}

return 0;

}

原文地址:https://www.cnblogs.com/inpeace7/p/2388823.html