线性筛法求解欧拉函数以及欧拉反演

欧拉函数

定义:

1~n中与n互质的数的个数称为欧拉函数,记为 φ ( n ) \varphi(n) φ(n)
φ ( 1 ) = 1 \varphi(1)=1 φ(1)=1
φ ( 2 ) = 1 \varphi(2)=1 φ(2)=1
φ ( 3 ) = 2 \varphi(3)=2 φ(3)=2

性质:

1、若p是质数, φ ( p ) \varphi(p) φ(p)=p-1

2、若p是质数, φ ( p k ) \varphi(p^{k}) φ(pk)= p k − 1 ∗ ( p − 1 ) p^{k-1}*(p-1) pk−1∗(p−1)

性质二解释:
1 , . . . , p , . . . , 2 ∗ p , . . . . . . , p k 1,...,p,...,2*p,......,p^{k} 1,...,p,...,2∗p,......,pk

可以将它们分段处理:

1,...,p\],\[p+1,...,2\*p\],... 可以发现每一段的大小都是p,所以会有 p k / p p\^{k}/p pk/p段,每一段都有(p-1)个,所以答案就是上述的描述 3、积性函数:若gcd(m,n)=1,则 φ ( m n ) = φ ( m ) ∗ φ ( n ) \\varphi(mn)=\\varphi(m)\*\\varphi(n) φ(mn)=φ(m)∗φ(n) ### 计算公式: ![请添加图片描述](https://i-blog.csdnimg.cn/direct/c676f9026b00436bae4d8e9b60d71047.jpeg) ### 总结: 根据推导的公式可以得出欧拉函数只与n和其1\~n之间的质数有关 ### 代码: ```cpp #include #define int long long #define ull unsigned long long using namespace std; const int N=2e5+10; int primes[N],cnt=0; bool vis[N]; int phi[N]; void init(){ phi[1]=1; for(int i=2;i>n; for(int i=1;i<=n;i++)cout<>_; while(_--)solve(); } ``` ## 欧拉反演 ### 定义: 对于任意的正整数n有: ∑ d ∣ n ϕ ( d ) = n \\sum_{d \\mid n}\\phi(d)=n ∑d∣nϕ(d)=n n的所有的因数(包含1和n本身)的欧拉函数之和等于n ### 证明: ![请添加图片描述](https://i-blog.csdnimg.cn/direct/f0db1687149646dabe4d4c88ad69dce3.jpeg) ### 应用: 求解 ∑ i = 1 n g c d ( i , n ) \\sum_{i=1}\^{n}gcd(i,n) ∑i=1ngcd(i,n)的时候可以优化,步骤如下: g c d ( i , n ) = ∑ d ∣ g c d ( i , n ) ϕ ( d ) gcd(i,n)=\\sum_{d\|gcd(i,n)}\\phi(d) gcd(i,n)=∑d∣gcd(i,n)ϕ(d) ![请添加图片描述](https://i-blog.csdnimg.cn/direct/84bc8b6f6ad14a748b341ea350179dd2.jpeg) ### 例题: ### 题目思路: ![请添加图片描述](https://i-blog.csdnimg.cn/direct/7539cef004bd4fba8c668cb84f44c37c.jpeg) ### 代码: ```cpp #include #define int long long #define ull unsigned long long using namespace std; const int N=2e5+10; int primes[N],cnt=0; bool vis[N]; int phi[N]; void init(){ phi[1]=1; for(int i=2;i>n; vectora(n+1); for(int i=1;i<=n;i++)cin>>a[i]; sort(a.begin()+1,a.end()); vectorcnt(N); int sum=0; for(int i=1;i<=n;i++){ for(int j=1;j*j<=a[i];j++){ if(a[i]%j==0){ sum+=(n-i)*phi[j]*cnt[j]; cnt[j]++; if(j*j!=a[i]){ sum+=(n-i)*phi[a[i]/j]*cnt[a[i]/j]; cnt[a[i]/j]++; } } } } cout<>_; while(_--)solve(); } ```

相关推荐
2401_8914821742 分钟前
多平台UI框架C++开发
开发语言·c++·算法
88号技师1 小时前
2026年3月中科院一区SCI-贝塞尔曲线优化算法Bezier curve-based optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
t198751281 小时前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
x_xbx2 小时前
LeetCode:148. 排序链表
算法·leetcode·链表
Darkwanderor2 小时前
三分算法的简单应用
c++·算法·三分法·三分算法
2401_831920742 小时前
分布式系统安全通信
开发语言·c++·算法
WolfGang0073212 小时前
代码随想录算法训练营 Day17 | 二叉树 part07
算法
温九味闻醉3 小时前
关于腾讯广告算法大赛2025项目分析1 - dataset.py
人工智能·算法·机器学习
炽烈小老头3 小时前
【 每天学习一点算法 2026/03/23】数组中的第K个最大元素
学习·算法·排序算法
老鱼说AI3 小时前
大规模并发处理器程序设计(PMPP)讲解(CUDA架构):第四期:计算架构与调度
c语言·深度学习·算法·架构·cuda