欧拉函数

欧拉函数:

\phi (n): 表示小于等于n且与n互质的正整数的个数。

拓展:小于等于n且与n互质的正整数的和 = \frac{n*\phi (n)}{2}  (n>1) 。(n=1时值为1)

性质:

1.

若p为质数:

\phi (p) = p-1 ;  (一个数为质数,那么小于等于它的数中只有它本身与它不互质)

若 i % p ==0 =>即 i与p不互质,\phi (i*p) = p * \phi (i)

若 i % p !=0 =>即 i与p互质,\phi (i*p) = (p-1)*\phi (i)

设 n = p^{k}\phi (n) = (p-1)*p^{k-1}

2.

若a,b互质,那么\phi (a,b)=\phi (a)*\phi (b)

3.

若n为奇数,\phi (2n)=\phi (n)

若n为偶数,\phi (2n)=2\phi (n)

4.

\frac{\phi (ab)}{\phi (a)*\phi (b)}=\frac{gcd(a,b)}{\phi (gcd(a,b))}

5 (important) .

n=\sum_{d|n}^{ }\phi (d)

=>  gcd(a,b)=\sum_{d|gcd(a,b)}^{ }\phi (d)=\sum_{d=1}^{min(a,b)}[d|a]*[d|b]*\phi (d)=\sum_{d|a}^{ }[d|b]*\phi (d)

6.

\phi (i^{2})=i*\phi (i)

 

\phi (n)

1. 打表:

int prime[maxn],phi[maxn];
int cnt=0;
bool flag[maxn];
void get_phi(){
    memset(flag,false,sizeof(flag));
    phi[1]=1;
    for(int i=2;i<maxn;i++){
        if(!flag[i]){                           
            prime[cnt++]=i;
            phi[i]=i-1;
        }
        for(int j=0;i*prime[j]<maxn;j++){
            flag[i*prime[j]]=true;           
            if(i%prime[j]==0){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}

2.非打表:

int phi(int n){
    int ans=1;
    for(int i=2;i*i<=n;i++){  // 可以的话这里换成质数表更佳
        if(n%i==0){
            n/=i;
            ans*=i-1;
            while(n%i==0){
                n/=i;
                ans*=i;
            }
        }
    }
    if(n>1) ans*=n-1;
    return ans;
}

 

应用:

1.

\sum_{a=1}^{m}\sum_{b=1}^{n}gcd(a,b)=\sum_{d=1}^{min(m,n)}\phi (d)*\left \lfloor \frac{m}{d} \right \rfloor*\left \lfloor \frac{n}{d} \right \rfloor

2.

\sum_{a=1}^{n}\sum_{b=1}^{n}lcm(a,b)=\sum_{i=1}^{n}f(i)

f(i)=n*\sum_{d\mid i }^{ }d*\phi (d)

3.

\sum_{i=1}^{n-1}[gcd(i,2n-i)=1]=\sum_{i=1}^{n-1}[gcd(i,2n)=1]=\frac{\phi (2n)}{2}

证:

结论:若a与b互质,则a与(a+b)互质,b也与(a+b)互质。反之亦然。

反证法:

=> 设a与(a+b)不互质,那么设gcd(a,a+b)=t,则a=t*x,a+b=t*y,得b=t*(y-x),这与a与b互质的条件矛盾,因此a与(a+b)互质。

<= 设a与b不互质,那么设gcd(a,b)=t,则a=t*x,b=t*y,得a+b=t*(x+y),这与a与(a+b)互质的条件矛盾,因此a与b互质。

\therefore 由 i 与 2n-i 互质可以推得,i 与 2n 互质,若i\in [1,2n-1],那么原式 = \phi (2n)

现在i\in [1,n-1],由上述结论可知,若 i 与 2n互质,那么 (2n-i) 与 2n 也互质,因此与 2n 互质的数的个数在 [1,n-1] 与 [n,2n-1] 里是相等的。

\therefore 原式 = \frac{\phi (2n)}{2}=\left\{\begin{matrix} \frac{\phi (n)}{2} & (n=2i+1) \\ \phi (n)&(n=2i) \end{matrix}\right.  (i是>=1的正整数)

特别的,当 i=1 时,原式 = 0 。

4.

\sum_{i=1}^{n}gcd(i,n)=\sum_{d|n}^{ }\phi (d)*\left \lfloor \frac{n}{d}\right \rfloor

证:

\sum_{i=1}^{n}gcd(i,n)=\sum_{i=1}^{n}\sum_{d|gcd(i,n)}^{ }\phi (d)=\sum_{i=1}^{n}\sum_{d=1}^{n}[d|i]*[d|n]*\phi (d)

若 [d|n] = 0,那么等式 = 0,对结果没有贡献,所以只需考虑 [d|n] = 1 的情况即可。

\therefore 原式 =\sum_{i=1}^{n}\sum_{d|n}^{ } [d|i] *\phi (d)

\because d的取值与 i 无关

\therefore 累加的顺序可以调换

原式 =\sum_{d|n}^{ }\sum_{i=1}^{n}[d|i]*\phi (d)=\sum_{d|n}^{ }\phi (d)\sum_{i=1}^{n}[d|i]=\sum_{d|n}^{ }\phi (d)*\left \lfloor \frac{n}{d} \right \rfloor .

code:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll n;
ll phi(ll m){
    ll ans=1;
    for(ll i=2;i*i<=m;i++){
        if(m%i==0){
            m/=i;
            ans*=i-1;
            while(m%i==0){
                m/=i;
                ans*=i;
            }
        }
    }
    if(m>1) ans*=m-1;
    return ans;
}

int main()
{
    scanf("%lld",&n);
    ll ans=0;
    for(int i=1;i*i<=n;i++){
        if(n%i==0){
            ll k=n/i;
            ans+=phi(i)*k;
            if(k!=i)
                ans+=phi(k)*i;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值