zoukankan      html  css  js  c++  java
  • 递推求欧拉函数

    for (i = 1; i <= maxn; i++)
            phi[i] = i;
        for (i = 2; i <= maxn; i += 2)
            phi[i] /= 2;
        for (i = 3; i <= maxn; i += 2)
            if (phi[i] == i)
            {
                for (j = i; j <= maxn; j += i)
                    phi[j] = phi[j] / i * (i - 1);
            }

    例子:poj2478

    Farey Sequence
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 11432   Accepted: 4438

    Description

    The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are 
    F2 = {1/2} 
    F3 = {1/3, 1/2, 2/3} 
    F4 = {1/4, 1/3, 1/2, 2/3, 3/4} 
    F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5} 

    You task is to calculate the number of terms in the Farey sequence Fn.

    Input

    There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are no blank lines between cases. A line with a single 0 terminates the input.

    Output

    For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn. 

    Sample Input

    2
    3
    4
    5
    0

    Sample Output

    1
    3
    5
    9

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    
    #define maxn 1000006
    
    long long phi[maxn], num[maxn];
    int n;
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        int i, j;
        for (i = 1; i <= maxn; i++)
            phi[i] = i;
        for (i = 2; i <= maxn; i += 2)
            phi[i] /= 2;
        for (i = 3; i <= maxn; i += 2)
            if (phi[i] == i)
            {
                for (j = i; j <= maxn; j += i)
                    phi[j] = phi[j] / i * (i - 1);
            }
        num[0] = 0;
        for (int i = 1; i < maxn; i++)
            num[i] = num[i - 1] + phi[i];
        while (scanf("%d", &n), n != 0)
        {
            printf("%lld
    ", num[n] - 1);
            //for(i=1;i<5;i++)
            //    cout<<phi[i]<<endl;
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    使用Python创建自己的Instagram滤镜
    TensorFlow v2.0实现逻辑斯谛回归
    自动驾驶研究回顾:CVPR 2019摘要
    dp cf 20190613
    简单搜索 kuangbin C D
    树形dp compare E
    区间dp E
    Codeforces Round #564 (Div. 2)
    网络流 + 欧拉回路 = B
    网络流 A
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/3583322.html
Copyright © 2011-2022 走看看