欧拉函数

来自: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;
}
原文地址:https://www.cnblogs.com/FuTaimeng/p/5661349.html