题目地址:http://poj.org/problem?id=2478
对于每个分母,既约真分数的个数就是小于n的与n互质的个数,即欧拉函数的值φ(n)n
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long LL;
void phi_table(int n,LL *phi)
{
for(int i=1;i<=n;i++) phi[i]=0;
phi[0]=1;
for(int i=2;i<=n;i++)
if(!phi[i]) //每一项i都是素数
for(int j=i;j<=n;j+=i) //i的倍数肯定都包含这个素因数
{
if(!phi[j]) phi[j]=j; //未计算的初始化为j,为了计算式子n*(1-1/p)中的n;
phi[j]=phi[j]/i*(i-1);
}
}
LL phi[1000000+5];
int main()
{
phi_table(1000000+3,phi);
int n;
while(cin>>n&&n)
{
LL sum=0;
for(int i=2;i<=n;i++) sum+=phi[i];
cout<<sum<<endl;
}
return 0;
}