题目大意:求所有分母不大于n的既约真分数个数
分母为x的既约真分数有φ(x)个
分母不大于n的既约真分数个数为 φ(1)+φ(2)+...+φ(n)
开始一直TLE,最后看了网上的思路,是在生成素数的同时,求出欧拉函数,之前没有想到过,要继续努力啊!!!
2478 | Accepted | 4060K | 235MS | C++ |
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#define N 1000100
using namespace std;
int data[N];
void phi()
{
int i,j;
memset(data,0,sizeof(data));
for(i=2;i<N;i++)
{
if(!data[i])
{
for(j=i;j<N;j+=i)
{
if(!data[j])
{
data[j]=j;
}
data[j]-=data[j]/i;
}
}
}
}
int main()
{
int n,i,j,k,ans;
phi();
while(scanf("%d",&n)&&n)
{
long long ans=0;
for(i=2;i<=n;i++)
ans+=data[i];
printf("%I64d\n",ans);
}
return 0;
}