题目:http://poj.org/problem?id=2478
只套模板的话都不懂为什么,希望弄明白为什么才能理解和记忆的更深刻,看了好几位前辈的博客才终于搞懂欧拉函数的证明和求法,多谢以下几位大牛的博文:
4、欧拉函数
#include <cstdio>
#define MAX 1000000
typedef long long LL;
LL phi[MAX + 5] = {0};
int main()
{
//step 1: 求出1~MAX范围内所有数的互质数个数,即每个数的欧拉函数
for(int i = 2; i <= MAX; ++i) phi[i] = i;
for(int i = 2; i <= MAX; i += 2) phi[i] >>= 1;//用(2-1)/2来更新所有2的倍数
for(int i = 3; i <= MAX; i += 2){
if(phi[i] == i){//说明i是一个素数,用(i-1)/i来更新所有i的倍数,相当于逐个遍历每个数的所有质因数
for(int j = i; j <= MAX; j += i){
phi[j] = phi[j] / i * (i - 1);
}
}
}
//step 2: 累加,让phi[n]表示[1,n]范围内欧拉函数的和
for(int i = 3; i <= MAX; ++i) phi[i] += phi[i-1];
//step 3: answer query
int n;
while(scanf("%d", &n), n) printf("%lld\n", phi[n]);
return 0;
}