zoukankan      html  css  js  c++  java
  • Farey Sequence(欧拉函数板子题)

    题目链接:http://poj.org/problem?id=2478

    Farey Sequence
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 19736   Accepted: 7962

    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

    Source

    POJ Contest,Author:Mathematica@ZSU
     
    题目大意:很容易可以发现是求2-n的所有数的欧拉函数值之和
    看代码:
    /**
    有三条特性
    若a为质数  phi[a]=a-1
    若a为质数,b%a==0   phi[a*b]=phi[b]*a;
    若a b 互质  phi[a*b]=phi[a]*phi[b](当a为质数  如果b%a!=0)
    
    */
    #include<iostream>
    #include<cstdio>
    using namespace std;
    typedef long long LL;
    const int maxn=1e6+50;
    int phi[maxn],prime[maxn],p[maxn];//phi[i]代表i的欧拉函数值  prime[i]=0代表是素数 1代表不是素数   p存储素数
    void make()
    {
        phi[1]=1;//特例
        int num=0;
        for(int i=2;i<=maxn;i++)
        {
            if(!prime[i])//是素数
            {
                p[num++]=i;//
                phi[i]=i-1;//素数的欧拉函数值就是它的值减1
            }
            for(int j=0;j<num&&p[j]*i<maxn;j++)//用当前已经得到的素数筛去p[j]*i
            {
                prime[p[j]*i]=1;//可以确定p[j]*i不是质数
                if(i%p[j]==0)//第二条特性
                {
                    phi[p[j]*i]=phi[i]*p[j];
                    break;//欧拉筛的核心语句  保证每个数只会被自己最小的质因子筛掉一次
                }
                else phi[p[j]*i]=phi[i]*phi[p[j]];
            }
        }
        return ;
    }
    
    int main()
    {
        make();
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            if(n==0) break;
            LL sum=0;
            for(int i=2;i<=n;i++) sum+=phi[i];
            printf("%lld
    ",sum);
        }
    //    for(int i=1;i<=100;i++) cout<<phi[i]<<" ";
    
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/caijiaming/p/10638640.html
Copyright © 2011-2022 走看看