欧拉函数 欧拉定理 扩展欧拉定理
数论 欧拉函数 欧拉定理 扩展欧拉定理
最近紧急恶补数论..
公式性质总结:
三个欧拉函数线性筛公式:
通项公式:
欧拉定理:
欧拉函数
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目。规定:\(\varphi(1)=1\)
求解欧拉函数:
方法一:
欧拉函数的通项公式:
欧拉函数通项公式的证明,从别人的博客偷过来的:
代码:
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;
}
}
}
至此,是欧拉函数的两种求法。两种方法各有优势,无法相互取代
欧拉定理
欧拉定理:
不会证明,但人家好背嘛ˋ( ° ▽、° )
回顾一下费马小定理:
同时,众所周知的是:
┌(。Д。)┐现在从欧拉定理看费马小定理,有没有看儿子的感觉
扩展欧拉定理
证明什么的自然是不会的..(/▽\)
例题
上帝与集合的正确用法
一句话题干:
乍一眼看上去好似误解,事实上我就是佩服出题人脑洞套用扩展欧拉定理之后,发现是可解的
设f(n)为模数为n时的答案,\(\zeta\)为那一坨无限平方
递归的边界易知:
解决( ̄︶ ̄)↗
Please, another Queries on Array?
CF1114F Please, another Queries on Array?
简述题干:
维护一个数列支持以下操作
为区间[l,r]乘上一个正整数
求区间乘积的欧拉函数
codeforce的出题人脑洞大出天际
单看操作一,只需要简单的线段树就可以实现
再看操作二..这,wtf?!
利用一下欧拉函数的通项公式:
由于题干的限制,不论是初始数组,还是后来乘上来的数字,其大小不会大于300,也就是说其质因数不会大于300。不大于300的质因数只有62个!
根据公式,我们需要知道:区间乘积和区间质因数情况,对于区间乘积,用long long存储,过程中不断用模数取余即可;对于区间质因数个数,用一个long long状压一下62个质因数的出现情况,由于只增不减的条件,数据变得很好处理。
ok,这就是亏我理解了,还是调了两个小时的题。。