欧拉函数 欧拉定理 扩展欧拉定理

数论 欧拉函数 欧拉定理 扩展欧拉定理

最近紧急恶补数论..

公式性质总结:
三个欧拉函数线性筛公式:

\[\varphi(p)=p-1 \]

\[\varphi(p\times i)=phi(p)\times phi(i) \quad i\mod p \not = 0 \]

\[\varphi(p\times i)=p\times phi(i) \quad i\mod p=0 \]

通项公式:

\[\varphi(n)=n\times \Pi_{i=1}^{n}(1-\frac{1}{p_i}) \quad (p_i为n的质因数) \]

欧拉定理:

\[a^{\varphi(p)}\equiv 1 \quad gcd(a,p)=1 \]

\[\]

扩展欧拉定理:
eSSrGT.png

欧拉函数

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目。规定:\(\varphi(1)=1\)

求解欧拉函数:

方法一

欧拉函数的通项公式:

\[\varphi (n)=n\times \Pi_{i=1}^{n}(1-\frac{1}{p_i}) (p_i为n的质因数) \]

欧拉函数通项公式的证明,从别人的博客偷过来的:

ZxMdUO.png

代码:

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

方法二

线性求欧拉函数

预备性质:

以下的p为质数

\[\varphi(p)=p-1 \]

性质一:这个好解释,因为p为质数,所以1~p-1的每一个数都和p互质

\[\varphi(p\times i)=\varphi(p)\times \varphi(i) \quad gcd(p,i)=1 \]

性质二:根据欧拉函数的积性?。。

\[\varphi(p\times i)=p\times \varphi(i) \quad gcd(p,i)=1 \]

性质三:。。<( ̄ c ̄)y▂ξ

然后将这三条性质代入欧拉筛即可

for(int i=2;i<=10000000;++i){
    if(!vis[i]){
        phi[i]=i-1; //性质一
        prime[++prime[0]]=i;
    }	
    for(int j=1;j<=prime[0]&&prime[j]*i<=10000000;++j){
    vis[prime[j]*i]=true;
    if(i%prime[j]!=0)
    phi[prime[j]*i]=phi[prime[j]]*phi[i]; //性质二
    else{
        phi[prime[j]*i]=prime[j]*phi[i]; //性质三
        break;
        }
    }
}

至此,是欧拉函数的两种求法。两种方法各有优势,无法相互取代

欧拉定理

欧拉定理:

\[a^{\varphi(p)}\equiv 1 (\mod p) \quad gcd(a,p)=1 \]

不会证明,但人家好背嘛ˋ( ° ▽、° )

回顾一下费马小定理:

\[a^{p-1}\equiv 1\quad gcd(a,p)=1 \]

同时,众所周知的是:

\[\varphi(p)=p-1 \]

┌(。Д。)┐现在从欧拉定理看费马小定理,有没有看儿子的感觉

扩展欧拉定理

扩展欧拉定理:
eSSrGT.png

证明什么的自然是不会的..(/▽\)

例题

上帝与集合的正确用法

P4139 上帝与集合的正确用法

一句话题干:
tksbaoj.png

乍一眼看上去好似误解,事实上我就是佩服出题人脑洞套用扩展欧拉定理之后,发现是可解的

设f(n)为模数为n时的答案,\(\zeta\)为那一坨无限平方

\[f(n)=\zeta \mod n \]

\[\quad =2^\zeta \mod n \]

\[\quad =2^{\zeta \mod \varphi(n) + \varphi(n)} \mod n \]

\[\quad =2^{f(\varphi(n))+\varphi(n)} \mod n \]

递归的边界易知:

\[f(1)=0 \]

解决( ̄︶ ̄)↗ 

Please, another Queries on Array?

CF1114F Please, another Queries on Array?

简述题干:

维护一个数列支持以下操作

  1. 为区间[l,r]乘上一个正整数

  2. 求区间乘积的欧拉函数

codeforce的出题人脑洞大出天际

单看操作一,只需要简单的线段树就可以实现

再看操作二..这,wtf?!

利用一下欧拉函数的通项公式:

\[\varphi (n)=n\times \Pi_{i=1}^{n}(1-\frac{1}{p_i}) (p_i为n的质因数) \]

由于题干的限制,不论是初始数组,还是后来乘上来的数字,其大小不会大于300,也就是说其质因数不会大于300。不大于300的质因数只有62个!

根据公式,我们需要知道:区间乘积和区间质因数情况,对于区间乘积,用long long存储,过程中不断用模数取余即可;对于区间质因数个数,用一个long long状压一下62个质因数的出现情况,由于只增不减的条件,数据变得很好处理。

ok,这就是亏我理解了,还是调了两个小时的题。。

posted @ 2020-06-29 22:23  ticmis  阅读(364)  评论(0编辑  收藏  举报