注意括号内分数分母相同时的区别
f(5)中以5为分母的数其分子均与5互质
进而推得:f(n)中以i为分母的数其各个分子均与i互质
因此:
用筛选法打表phi,再预处理下即可
看到别人说也可以用欧拉函数的积性性质来做,有兴趣的可以看一下
我的代码如下:
#include <stdio.h>
#define MAXN 1001000
#define LL long long
LL phi[MAXN];
void phi_table(int n) {
int i, j;
for(i=2; i<=n; ++i) {
phi[i] = 0;
}
phi[1] = 1;
for(i=2; i<=n; ++i) {
if(!phi[i]) {
for(j=i; j<=n; j+=i) {
if(!phi[j])
phi[j] = j;
phi[j] = phi[j]/i*(i-1);
}
}
}
for(i=3; i<=n; ++i)
phi[i] += phi[i-1];
}
int main(void) {
int n;
phi_table(MAXN);
while(scanf("%d", &n), n) {
printf("%lld\n", phi[n]);
}
return 0;
}