欧拉函数

#欧拉函数及应用
标签:专题
一、欧拉函数的概念和本质
欧拉函数是指1到n中与n互质的的数的个数
*但是欧拉函数是工具,用来提供一到n中与n互质数的个数*
二、欧拉函数的性质
1.对于素数p,φ(p)=p-1,对于对两个素数p,q φ(pq)=pq-1
2.即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立.
3.如果n是质数的某一次方
φ(p^k)=p^k-p^(k-1)=p^k(1-1/p)
4.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn.
φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).
5.我们知道,一个数K能分解成p1^(q1)*p2^(q2)...
那么,这个数的因子个数就是(1+q1)*(1+q2)*...*(1+qk)
三、实际操作
1.Longge的问题
你需要求出∑gcd(i, N)(1<=i <=N)。
#Solution
题目中要求出∑gcd(i,N)(1<=i<=N)。
枚举n的约数k,令s(k)为满足gcd(m,n)=k,(1<=m<=n)m的个数,则ans=sigma(k*s(k)) (k为n的约数)
因为gcd(m,n)=k,所以gcd(m/k,n/k)=1,于是s(k)=euler(n/k)

#include<iostream>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
LL n,ans;
int m;
LL phi(LL x)
{
    LL t=x;
    for(LL i=2;i<=m;i++)2018-02-22
        if(x%i==0)
        {
            t=t/i*(i-1);
            while(x%i==0)x/=i;
        }
    if(x>1)t=t/x*(x-1);
    return t;
}
int main()
{
    scanf("%lld",&n);
    m=sqrt(n);
    for(int i=1;i<=m;i++)
        if(n%i==0)
        {
            ans+=(LL)i*phi(n/i);
            if(i*i<n)ans+=(LL)(n/i)*phi(i);  
        }
    printf("%lld",ans);
    return 0;
}

 


2. 仪仗队
#Solution
只有列数和行数互质的才能看见.

#include<bits/stdc++.h>
using namespace std;
int n,m,tot;
int phi(int x){
    int t=x;
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0){
            t=t/i*(i-1);
            while(x%i==0)x/=i;
        }
    if(x>1)t=t/x*(x-1);
    return t;
}
int main(){
    cin>>n;
    if(n==1){
        cout<<0;
        return 0;
    }
    m=sqrt(n);
    for(int i=1;i<n;i++)
        tot+=phi(i);
    tot*=2;
    tot++;
    cout<<tot<<endl;
    return 0;
}

 

原文地址:https://www.cnblogs.com/KingBenQi/p/8459895.html