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

欧拉函数

定义:

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(); } ```

相关推荐
啊森要自信9 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹9 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事9 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao9 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头9 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa9 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior9 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Σίσυφος190010 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl10 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL10 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试