D - Farey Sequence

题目:D - Farey Sequence

题目明说了:a/b with 0 < a < b <= n and gcd(a,b) = 1。所以,对每个数x,我们只要找出比x小与x互素的数的总数phi(x)出来就可以,然后对每一个n答案就是sum{phi(i)},i∈[2,n]。找比x小与x互素的数的总数可以用到欧拉函数,我也不知道原理是什么我直接抄模板的……

复制代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;

const int MAXN = 1000010;

LL phi[MAXN];

void phi_table(int n) {
    //for(int i = 2; i <= n; ++i) phi[i] = 0;
    phi[1] = 1;
    for(int i = 2; i <= n; ++i) if(!phi[i])
        for(int j = i; j <= n; j += i) {
            if(!phi[j]) phi[j] = j;
            phi[j] = phi[j] / i * (i - 1);
        }
}

int main() {
    phi_table(1000000);
    for(int i = 3; i <= 1000000; ++i) phi[i] += phi[i - 1];
    int n;
    while(scanf("%d", &n) != EOF) {
        if(n == 0) break;
        cout<<phi[n]<<endl;
    }
}
复制代码

 

posted on   SCNUACM  阅读(187)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示