【算法学习】欧拉函数φ
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!5.线段覆盖问题6.【算法学习】学换根dp有感7.二分图最大匹配8.【算法学习】01BFS9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树19.圆方树20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理
29.【算法学习】欧拉函数φ
30.【算法学习】二维转一维问题31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心欧拉函数 定理
欧拉函数,即 \(\varphi(n)\),表示的是小于等于 \(n\) 和 \(n\) 互质的数的个数,详细定义看wiki。
欧拉函数其实就是容斥原理的应用,举个例子:
如 \(n=6\),\(1,2,3,4,5,6\) 是整个序列,我们将 \(6\) 的质因子 \(2\),\(3\) 取出,减去小于等于 \(6\) 的 \(2\) 的倍数和 \(3\) 的倍数,但是 \(2\) 和 \(3\) 的公倍数 \(6\) 被减了两次所以还要再加一次:\(6-\frac{6}{2}-\frac{6}{3}+\frac{6}{6}=2\)
将这个公式转化一下就可以得到通用公式(\(p\) 为 \(n\) 的质因数):
\[\varphi(n)=n\times (1- \frac{1}{p_1})\times (1- \frac{1}{p_2}) \times ……\times (1- \frac{1}{p_k})
\]
看什么代码,自己写
#include <bits/stdc++.h> using namespace std; #define ll long long int n,m; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ cin>>n; m=n; for(int i=2;i*i<=n;i++){ if(n%i==0){ m*=(1-1.0/i); while(n%i==0){ n/=i; } } } if(n>1){ m*=(1-1.0/n); } cout<<m<<"\n"; } return 0; }
用线性筛求欧拉函数:
求 \(1-n\) 所有数的欧拉函数的总和。
注意点是 \(1-n\) 所有的数与欧拉函数质因子的性质就和欧拉筛相符(应该不是巧合),所以在求质数的时候向后更新欧拉函数值。
这个就不用再分别讨论列举了吧。
给你看看代码吧
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e7; int n; int is[N]; int p[N]; ll phi[N]; int cnt; ll solve(){ phi[1]=1; for(int i=2;i<=n;i++){ if(is[i]==0){ p[++cnt]=i; phi[i]=i-1;//质数全沪指 } for(int j=1;j<=cnt;j++){ if(i*p[j]>n) break; is[p[j]*i]=1; if(i%p[j]==0){ phi[p[j]*i]=p[j]*phi[i]; break; } else phi[p[j]*i]=(p[j]-1)*phi[i]; } } ll ans=0; for(int i=1;i<=n;i++) ans+=phi[i]; return ans; } int main() { cin>>n; cout<<solve(); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!