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

    来自:http://blog.csdn.net/leolin_/article/details/6642096

    欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。

    通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。

    对于质数p,φ(p) = p - 1。注意φ(1)=1.

    欧拉定理:对于互质的正整数a和n,有aφ(n) ≡ 1 mod n。

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

                                          若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。

    特殊性质:当n为奇数时,φ(2n)=φ(n)

    欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。

    可以在筛法求素数时同时计算欧拉函数:

    (codevs 2269 仪仗队)

    #include<iostream>
    #include<cstring>
    #define Size 40005 
    using namespace std;
    
    int n;
    int prime[Size],phi[Size];
    bool bo[Size];
    
    void getphi(){
        memset(bo,true,sizeof(bo));
        int tot=0;
        phi[1]=1;
        for(int i=2;i<=n;i++){
            if(bo[i]){
                prime[++tot]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=tot;j++){
                if(i*prime[j]>n)break;
                bo[i*prime[j]]=false;
                if(i%prime[j]==0){
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
    
    int main(){
        cin>>n;
        getphi();
        int ans=0;
        for(int i=1;i<n;i++){
            ans+=phi[i];
        }
        ans=ans*2+1;
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    逐步实现python版wc命令
    Linux中短横线(-)小记
    memcached启动脚本(class练习)
    nginx启动脚本(class练习)
    Python-类的方法
    re模块
    shutil模块
    时间模块(time/date)
    迭代器
    生成器
  • 原文地址:https://www.cnblogs.com/FuTaimeng/p/5661349.html
Copyright © 2011-2022 走看看