《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
Posted 繁凡さん
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)相关的知识,希望对你有一定的参考价值。
整理的算法模板合集: ACM模板
实际上是一个全新的精炼模板整合计划
写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无任何商业用途。因个人实力时间等原因,本文并非完全原创,请大家见谅。
目录
《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
《算法竞赛中的初等数论》(信奥 / 数竞 / ACM)前言、后记、目录索引(十五万字符的数论书)
全文目录索引链接: https://fanfansann.blog.csdn.net/article/details/113765056
0x50 筛法
0x51 线性筛法
在上面筛质数的时候,我们讲解了如何使用线性筛线性地筛出 1 , ⋯ , n 1,\\cdots,n 1,⋯,n 中的所有质数。
每次只用一个数用小于当前这个数最小质因子的质数去筛其他数,即保证每个合数 i × p j i\\times p_j i×pj 只都被自己的最小质因子 p j p_j pj 筛掉一遍,所以复杂度保证是 O ( n ) O(n) O(n) 的。
我们知道,凡是积性函数,均可由线性筛法来求解。
0x51.1 线性筛法求欧拉函数
我们注意到在线性筛中,每一个合数都是被最小的质因子筛掉,筛法求素数的同时也得到了每个数的最小质因子,这是线性筛求欧拉函数的关键。
1. 考虑 n = p j k n=p_j^k n=pjk, φ ( n ) \\varphi(n) φ(n)
显然有 φ ( p j k ) = p j k − p j k − 1 = p j k − 1 × ( p j − 1 ) \\varphi(p_j^k)=p_j^k-p_j^k-1=p_j^k-1\\times(p_j-1) φ(pjk)=pjk−pjk−1=pjk−1×(pj−1)
2. 考虑 n = i × p j n=i\\times p_j n=i×pj, φ ( n ) \\varphi(n) φ(n),当 p j ∣ i p_j\\mid i pj∣i
即 i i i 含有因子 p j p_j pj,由于 i = n p j i=\\fracnp_j i=pjn 即 i i i 拥有 n n n 的所有质因子,由唯一分解定理及欧拉函数计算式得:
φ
(
n
)
=
n
×
∏
i
=
1
s
p
i
−
1
p
i
=
p
1
×
n
′
×
∏
i
=
1
s
p
i
−
1
p
i
=
p
1
×
φ
(
n
′
)
\\beginaligned \\varphi(n) & = n \\times \\prod_i = 1^s\\fracp_i - 1p_i & \\\\ &= p_1 \\times n' \\times \\prod_i = 1^s\\fracp_i - 1p_i & \\\\ &= p_1 \\times \\varphi(n') \\endaligned
φ(n)=n×i=1∏spipi−1=p1×n′×i=1∏spipi−1=p1×φ(n′)
3. 考虑
n
=
i
×
p
j
n=i\\times p_j
n=i×pj,
φ
(
n
)
\\varphi(n)
φ(n),当
p
j
∤
i
p_j\\nmid i
pj∤i
即 i i i 与 p j p_j pj 互质,积性函数显然有性质:
φ ( n ) = φ ( i ) × φ ( p j ) = φ ( i ) × ( p j − 1 ) \\beginaligned \\varphi(n) & = \\varphi(i) \\times \\varphi(p_j) & \\\\ & = \\varphi(i) \\times (p_j - 1) \\endaligned φ(n)=φ(i)×φ(pj)=φ(i)×(pj−1)
由于我们仅在在线性筛的框架上增加了一些细节,所以时间复杂度依然是 O ( n ) O(n) O(n) 的。
Code
void get_euler(int n)
phi[1] = 1;
for(int i = 2; i <= n; ++ i)
if(!vis[i])
primes[ ++ cnt] = i;
phi[i] = i - 1;
for(int j = 1; j <= cnt && i * primes[j] <= n; ++ j)
vis[i * primes[j]] = true;
if(i % primes[j] == 0) //最小的质因子
phi[i * primes[j]] = phi[i] * primes[j];
break;
phi[i * primes[j]] = phi[i] * (primes[j] - 1);
0x51.2 线性筛求莫比乌斯函数
同样考虑三种情况即可。
1. 考虑 n = p j k n=p_j^k n=pjk, μ ( n ) \\mu (n) μ(n)
显然有
μ ( p j ) = − 1 \\mu(p_j)=-1 μ(pj)=−1
μ ( p j k ) = 0 , k > 1 \\mu(p_j^k)=0,k>1 μ(pjk)=0,k>1
2. 考虑
n
=
i
×
p
j
n=i\\times p_j
n=i×pj,
μ
(
n
)
\\mu(n)
μ(n)< 以上是关于《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)的主要内容,如果未能解决你的问题,请参考以下文章 《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书) 《算法竞赛中的初等数论》正文 0x60 原根(ACM / OI / MO)(二十万字符数论书) 《算法竞赛中的初等数论》正文 0x00整除0x10 整除相关(ACM / OI / MO)(十五万字符数论书) 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)