UVA 11426 (欧拉函数)

来源:互联网 发布:java容器有哪些 编辑:程序博客网 时间:2024/06/04 17:49

白书125页例题。

gcd(x,n)所有可能的值是n的约数,要满足gcd(x,n) = i(i是n的约数)必然有gcd (x/i, n/i) = 1,也就是ph(n/i)的值。也就是对于每一个数i,如果i是n的约数,那么i在以n结尾的gcd中出现phi(i)次,这就是i对答案的贡献。

 

#include <bits/stdc++.h>using namespace std;#define maxn 4000000long long phi[maxn+5];long long f[maxn+5], sum[maxn+5];void init () { //打表    for (int i = 2; i <= maxn; i++)        phi[i] = 0;    phi[1] = 1;    for (int i = 2; i <= maxn; i++) if (!phi[i]) {        for (int j = i; j <= maxn; j += i) {            if (!phi[j])                phi[j] = j;            phi[j] = phi[j] / i * (i-1);        }    }    memset (f, 0, sizeof f);    for (int i = 1; i <= maxn; i++) {        for (int j = i+i; j <= maxn; j += i)            f[j] += i*phi[j/i];    }     sum[2] = 1;    for (int i = 3; i <= maxn; i++)        sum[i] = sum[i-1]+f[i];    return ;}int n;int main () {    //freopen ("in", "r", stdin);    init ();    while (cin >> n && n) {        cout << sum[n] << endl;    }    return 0;}

0 0