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;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    Hibernate--Day01
    Java语言基础之数组
    Java语言基础之方法的设计
    Jmeter-文件目录
    Jmeter-简介及安装
    测试基础-测试策略与类型
    测试基础-软件测试计划
    测试基础-软件测试流程与测试模型
    测试基础-软件测试的环境
    测试基础-软件测试目的与对象
  • 原文地址:https://www.cnblogs.com/caijiaming/p/10638640.html
Copyright © 2011-2022 走看看