zoukankan      html  css  js  c++  java
  • HDU 2824 The Euler function (欧拉函数)

    The Euler function

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 26   Accepted Submission(s) : 16
    Problem Description
    The Euler function phi is an important kind of function in number theory,  (n) represents the amount of the numbers which are smaller than n and coprime to n, and this function has a lot of beautiful characteristics. Here comes a very easy question: suppose you are given a, b, try to calculate  (a)+ (a+1)+....+ (b)
     
    Input
      There are several test cases. Each line has two integers a, b (2<a<b<3000000).
     
    Output
        Output the result of  (a)+ (a+1)+....+ (b)
     
    Sample Input
    3 100
     
    Sample Output
    3042
     
    Source
    2009 Multi-University Training Contest 1 - Host by TJU
     
     
    解析:(转)

    定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质的数的数目。

        例如:φ(8)=4,因为1357均和8互质。

    性质:1.p是质数,φ(p)= p-1.

       2.n是质数pk次幂,φ(n)=(p-1)*p^(k-1)。因为除了p的倍数都与n互质

       3.欧拉函数是积性函数,若m,n互质,φ(mn)= φ(m)φ(n).

      根据这3条性质我们就可以推出一个整数的欧拉函数的公式。因为一个数总可以写成一些质数的乘积的形式。

      E(k)=(p1-1)(p2-1)...(pi-1)*(p1^(a1-1))(p2^(a2-1))...(pi^(ai-1))

        = k*(p1-1)(p2-1)...(pi-1)/(p1*p2*...*pi)

        = k*(1-1/p1)*(1-1/p2)...(1-1/pk)

    在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(aN的质因素)

      若( N%a ==0&&(N/a)%a ==0)则有:E(N)= E(N/a)*a;

      若( N%a ==0&&(N/a)%a !=0)则有:E(N)= E(N/a)*(a-1);

     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    const int N=3000010;
    
    int prime[N],isprime[N];
    int phi[N];
    
    void get_phi(){
        int i,j,cnt=0;
        for(i=2;i<N;i++){
            if(isprime[i]==0){
                prime[cnt++]=i;
                phi[i]=i-1;
            }
            for(j=0;j<cnt && i*prime[j]<N;j++){     //注意这里,i*prime[j]<N 可换成 prime[j]<=N/i(带等号)
                isprime[i*prime[j]]=1;
                if(i%prime[j]==0)
                    phi[i*prime[j]]=phi[i]*prime[j];
                else
                    phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        long long sum;
        int a,b;
        get_phi();
        while(~scanf("%d%d",&a,&b)){
            sum=0;
            for(int i=a;i<=b;i++)
                sum+=phi[i];
            cout<<sum<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/jackge/p/2823235.html
Copyright © 2011-2022 走看看