由于文章正文太长,不得不分几篇博客。
本篇为数论基础内容,学习过数论的可以跳过。
最近学了莫比乌斯反演和一点狄利克雷卷积,感觉很难,也是看了很多博客才有点明,写一篇博客帮助自己理解。
由于数论大多基于正整数讨论,故除特殊说明外,本文所有变量都为正整数。
模是一种运算,与加、减、乘、除、乘方、开方同为最常用的 7 7 7种运算。
取 a / b a/b a/b的余数,称为 a a a模 b b b,一般记为 a m o d b a\bmod b amodb或 a % b a\%b a%b
模运算的优先度等于乘除法。
1、分配律:
( a ± b ) % p = ( a % p ± b % p ) % p (a\pm b)\%p=(a\%p\pm b\%p)\%p (a±b)%p=(a%p±b%p)%p
( a × b ) % p = ( a % p × b % p ) % p (a\times b)\% p=(a\%p\times b\%p)\%p (a×b)%p=(a%p×b%p)%p
a b % p = ( a % p ) b % c a^b\%p=(a\%p)^b\%c ab%p=(a%p)b%c
分配律告诉我们,在大部分取模的题目中,每一次计算都取模是正确的。
2、放缩性:
若 a % p = b a\%p=b a%p=b,则 ( a × c ) % ( p × c ) = b × c (a\times c)\%(p\times c)=b\times c (a×c)%(p×c)=b×c
若 a % p = b a\%p=b a%p=b, a % c = 0 , b % c = 0 a\%c=0,b\%c=0 a%c=0,b%c=0,则 a c % p c = b c \dfrac a c\%\dfrac p c=\dfrac b c ca%cp=cb
若自然数 n n n 和 m m m 满足 n % m = 0 n\%m=0 n%m=0,即 n n n除以 m m m的余数为 0 0 0,则称 m m m 整除 n n n,记为 m ∣ n m|n m∣n,注意其中 n n n 为被除数, m m m为除数.
1、若 a ∣ b , b ∣ c a|b,b|c a∣b,b∣c,则 a ∣ c a|c a∣c
证明:
基础。设 k 1 a = b , k 2 b = c k_1a=b,k_2b=c k1a=b,k2b=c,则 k 2 ⋅ k 1 a = c k_2\cdot k_1a=c k2⋅k1a=c,即 a ∣ c a|c a∣c.
这是整除证明中的大部分思路,将整除关系转化为倍数关系证明。
2、若 a ∣ b , a ∣ c a|b,a|c a∣b,a∣c,则 a ∣ b c a|bc a∣bc
3、若 a ∣ c , b ∣ c a|c,b|c a∣c,b∣c 且 a a a与 b b b互质,则 a b ∣ c ab|c ab∣c
4、若 a ∣ b , b ∣ a a|b,b|a a∣b,b∣a,则 a = b a=b a=b
若 n % p = m % p n\%p=m\%p n%p=m%p,即 n , m n,m n,m除以 p p p的余数相等,称 n , m n,m n,m在模 p p p意义下同余,记为 n ≡ m m o d p n\equiv m\mod p n≡mmodp.
1、 a ≡ a m o d p a\equiv a\mod p a≡amodp
2、若 a ≡ b m o d p a\equiv b\mod p a≡bmodp,则 b ≡ a m o d p b\equiv a\mod p b≡amodp
3、若 n ≡ m m o d p n\equiv m\mod p n≡mmodp, n + a 1 p ≡ m + a 2 p ≡ n ≡ m m o d p n+a_1p\equiv m+a_2p\equiv n\equiv m\mod p n+a1p≡m+a2p≡n≡mmodp
证明: n = k 1 p + q , m = k 2 p + q n=k_1p+q,m=k_2p+q n=k1p+q,m=k2p+q, n + a 1 p = ( k 1 + a 1 ) p + q n+a_1p=(k_1+a_1)p+q n+a1p=(k1+a1)p+q,所以 n + a 1 p ≡ n m o d p n+a_1p\equiv n\mod p n+a1p≡nmodp, m m m与 m + a 2 p m+a_2p m+a2p同理。
这也是同余证明的大部分思路,将同余关系转化为我们熟悉的倍数和关系证明。
4、若 a ≡ b m o d p , c ≡ d m o d p a\equiv b\mod p,c\equiv d\mod p a≡bmodp,c≡dmodp,则 a ± c ≡ b ± d m o d p , a c ≡ b d m o d p a\pm c\equiv b\pm d\mod p,ac\equiv bd\mod p a±c≡b±dmodp,ac≡bdmodp
5、若 a c ≡ b c m o d p , c ≠ 0 ac\equiv bc\mod p,c\ne 0 ac≡bcmodp,c=0,则 a ≡ b m o d p ( p , c ) a\equiv b\mod \dfrac p {(p,c)} a≡bmod(p,c)p
6、若 a ≡ b m o d p a\equiv b\mod p a≡bmodp,则 a c ≡ b c m o d p ac\equiv bc\mod p ac≡bcmodp
7、若 a ≡ b m o d p a\equiv b\mod p a≡bmodp,则 a c ≡ b c m o d p a^c\equiv b^c\mod p ac≡bcmodp
若 a b ≡ 1 m o d p ab\equiv 1\mod p ab≡1modp,称 a a a, b b b在模 p p p意义下互为逆元,也称 a a a为 b b b在模 p p p意义下的逆元, b b b为 a a a在模 p p p意义下的逆元,可记为 b ≡ a − 1 m o d p , a ≡ b − 1 m o d p b\equiv a^{-1}\mod p,a\equiv b^{-1}\mod p b≡a−1modp,a≡b−1modp.
可以认为 a a a与 b b b在模 p p p意义下互为倒数。这就是说,在模 p p p意义下, b b b就是 1 a \dfrac 1 a a1
从定义可以发现,逆元的大部分用途用于求 a b m o d p \frac a b \mod p bamodp的值,因为 a ≡ b − 1 m o d p a\equiv b^{-1}\mod p a≡b−1modp, a b = a ⋅ b − 1 \frac a b=a\cdot b^{-1} ba=a⋅b−1,即求 a a a乘上 b b b的逆元模 p p p.
求逆元的方法可以用下面的定理。
1、费马小定理:若 a a a与 p p p互质且 p p p为质数,则 a p − 1 ≡ 1 m o d p a^{p-1}\equiv 1\mod p ap−1≡1modp
一般的题目求逆元多用这个定理,因为大部分题目的模数 p p p都为 998244353 998244353 998244353或 1 0 9 + 7 10^9+7 109+7这类质数。
a p − 1 ≡ 1 m o d p a^{p-1}\equiv 1\mod p ap−1≡1modp
则 a p − 2 ⋅ a ≡ 1 m o d p a^{p-2}\cdot a\equiv 1\mod p ap−2⋅a≡1modp
所以 a a a在模 p p p意义下的逆元为 a p − 2 m o d p a^{p-2}\bmod p ap−2modp.
2、欧拉定理:若 a a a与 p p p互质,则 a ϕ ( p ) ≡ 1 m o d p a^{\phi(p)}\equiv 1\mod p aϕ(p)≡1modp.
欧拉函数: ϕ ( n ) = ∑ i = 1 n [ ( i , n ) = 1 ] \phi(n)=\sum\limits_{i=1}^n[(i,n)=1] ϕ(n)=i=1∑n[(i,n)=1]
( i , n ) (i,n) (i,n)表示 i i i与 n n n的最大公约数,等价于 g c d ( i , n ) gcd(i,n) gcd(i,n).
[ ( i , n ) = 1 ] [(i,n)=1] [(i,n)=1]是艾弗森表示法,当 ( i , n ) = 1 (i,n)=1 (i,n)=1时为 1 1 1,否则为 0 0 0.
欧拉函数 ϕ ( n ) \phi(n) ϕ(n)为小于 n n n的正整数中与 n n n互质的数。
容易发现, ϕ ( p ) = p − 1 ( p ∈ P , 即 p 为质数 ) \phi(p)=p-1(p\in P,即p为质数) ϕ(p)=p−1(p∈P,即p为质数)
费马小定理为欧拉定理的特殊情况,因为 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p−1.
3、扩展欧拉定理: a b ≡ a ( b m o d ϕ ( p ) ) + ϕ ( p ) m o d p a^b\equiv a^{(b\bmod \phi(p))+\phi(p)}\mod p ab≡a(bmodϕ(p))+ϕ(p)modp
以上 3 3 3个定理的关系为:费马小定理 ⊂ \subset ⊂欧拉定理 ⊂ \subset ⊂扩展欧拉定理
即扩展欧拉定理包含了前两个定理。
以上 3 3 3个定理本人均不会证明,证明请自行bdfs。
若 a a a与 b b b互质时有 f ( a ) × f ( b ) = f ( a × b ) f(a)\times f(b)=f(a\times b) f(a)×f(b)=f(a×b),则称 f f f为积性函数,又称数论函数。
若对于任意 a a a和 b b b均满足 f ( a ) × f ( b ) = f ( a × b ) f(a)\times f(b)=f(a\times b) f(a)×f(b)=f(a×b),则称 f f f为完全积性函数。完全积性函数属于积性函数。
单位函数: ϵ = [ n = 1 ] \epsilon=[n=1] ϵ=[n=1]
常数函数: I ( n ) = 1 I(n)=1 I(n)=1
恒等函数: I d ( n ) = n Id(n)=n Id(n)=n
幂函数: I d k ( n ) = n k Id_k(n)=n^k Idk(n)=nk
常数函数为 k = 0 k=0 k=0的幂函数,恒等函数为 k = 1 k=1 k=1的幂函数。
欧拉函数: ϕ ( n ) = ∑ i = 1 n [ ( i , n ) = 1 ] \phi(n)=\sum\limits_{i=1}^n[(i,n)=1] ϕ(n)=i=1∑n[(i,n)=1]
引理1: ϕ ( p k ) = p k ( 1 − 1 p ) \phi(p^k)=p^k(1-\dfrac 1 p) ϕ(pk)=pk(1−p1),其中 p ∈ P p\in P p∈P
证明:
我们知道, ϕ ( p k ) \phi(p^k) ϕ(pk)表示小于 p k p^k pk的正整数中与 p k p^k pk互质的数的个数。
思考 [ 1 , p k ] [1,p^k] [1,pk]中有多少个数与 p k p^k pk不互质。这就是“从反面思考”。
若数 d d d与 p k p^k pk不互质,由于 p k p^k pk只有 p p p这一个质因数,所以 d = b p d=bp d=bp.
那么 b b b的取值数就等于 [ 1 , p k ] [1,p^k] [1,pk]中与 p k p^k pk不互质的数的数量。
显然, b b b的取值从 1 1 1到 p k − 1 p^{k-1} pk−1,因为 b p ≤ p k bp\le p^k bp≤pk。
所以 [ 1 , p k ] [1,p^k] [1,pk]中与 p k p^k pk不互质的数有 p k − 1 p^{k-1} pk−1个。
所以 ϕ ( p k ) = p k − p k − 1 = p k ( 1 − 1 p ) \phi(p^k)=p^k-p^{k-1}=p^k(1-\dfrac 1 p) ϕ(pk)=pk−pk−1=pk(1−p1)
引理2: ϕ ( n ) = n ∏ p ∣ n , p ∈ P ( 1 − 1 p ) \phi(n)=n\prod\limits_{p|n,p\in P}(1-\dfrac 1 p) ϕ(n)=np∣n,p∈P∏(1−p1)
证明:
从反面思考或利用容斥原理易证————百度百科
用引理1可以很快速地证明引理2。
ϕ ( n ) = ϕ ( p 1 a 1 p 2 a 2 … p k a k ) = ϕ ( p 1 a 1 ) ϕ ( p 2 a 2 ) … ϕ ( p k a k ) = p 1 a 1 ( 1 − 1 p 1 ) p 2 a 2 ( 1 − 1 p 2 ) … p k a k ( 1 − 1 p k ) = n ∏ p ∣ n , p ∈ P ( 1 − 1 p ) \phi(n)=\phi(p_1^{a_1}p_2^{a_2}\dots p_k^{a_k})=\phi(p_1^{a_1})\phi(p_2^{a_2})\dots \phi(p_k^{a_k})=p_1^{a_1}(1-\dfrac 1 {p_1})p_2^{a_2}(1-\dfrac 1 {p_2})\dots p_k^{a_k}(1-\dfrac 1 {p_k})=n\prod\limits_{p|n,p\in P}(1-\dfrac 1 p) ϕ(n)=ϕ(p1a1p2a2…pkak)=ϕ(p1a1)ϕ(p2a2)…ϕ(pkak)=p1a1(1−p11)p2a2(1−p21)…pkak(1−pk1)=np∣n,p∈P∏(1−p1)
其中 p i ∈ P p_i\in P pi∈P.
引理2较引理1更为常用。事实上,引理1是在证明引理2的过程中引出的。
引理3: n = ∑ d ∣ n ϕ ( d ) n=\sum\limits_{d|n}\phi(d) n=d∣n∑ϕ(d)
证明:
设 f ( x ) = ∑ i = 1 n [ ( i , n ) = x ] f(x)=\sum\limits_{i=1}^n[(i,n)=x] f(x)=i=1∑n[(i,n)=x],即区间 [ 1 , n ] [1,n] [1,n]中满足 g c d ( i , n ) = x gcd(i,n)=x gcd(i,n)=x的数的个数。有 f ( x ) = ϕ ( n x ) f(x)=\phi(\dfrac n x) f(x)=ϕ(xn),因为与 n x \dfrac n x xn互质的数 a a a满足 g c d ( a , n x ) = 1 gcd(a,\dfrac n x)=1 gcd(a,xn)=1,则 g c d ( a x , n ) = x gcd(ax,n)=x gcd(ax,n)=x.
枚举每一个可能的 g c d ( i , n ) gcd(i,n) gcd(i,n),得 n = ∑ d ∣ n f ( d ) = ∑ d ∣ n ϕ ( n d ) n=\sum\limits_{d|n}f(d)=\sum\limits_{d|n}\phi(\dfrac n d) n=d∣n∑f(d)=d∣n∑ϕ(dn).
注意这个式子有对称性,因为 d ∣ n d|n d∣n,所以 n d ∣ n \dfrac n d|n dn∣n.
所以 n = ∑ d ∣ n ϕ ( d ) n=\sum\limits_{d|n}\phi(d) n=d∣n∑ϕ(d),得证。
莫比乌斯函数: μ ( n ) = { 1 n = 1 ( − 1 ) k n = p 1 p 2 … p k ( p i ∈ P ) 0 p 2 ∣ n ( p ∈ P ) \mu(n)=\begin{cases}1&n=1\\(-1)^k&n=p_1p_2\dots p_k(p_i\in P)\\0&p^2|n(p\in P)\end{cases} μ(n)=⎩ ⎨ ⎧1(−1)k0n=1n=p1p2…pk(pi∈P)p2∣n(p∈P)
当 n n n有多个(指大于等于 2 2 2)相同的质因子时, μ ( n ) = 0 \mu(n)=0 μ(n)=0,否则由 n n n的质因数个数决定,若 n n n有奇数个质因数,则 μ ( n ) = − 1 \mu(n)=-1 μ(n)=−1,否则 μ ( n ) = 1 \mu(n)=1 μ(n)=1.
特别的, μ ( 1 ) = 1 \mu(1)=1 μ(1)=1.
从定义可以看出,莫比乌斯函数多作为多项式(一般为和式或乘积)中的系数出现,因为其只有三个取值: 1 1 1, − 1 -1 −1和 0 0 0.
这就告诉我们,莫比乌斯函数具有很好的容斥天赋,容斥的和式中多有 ( − 1 ) k (-1)^k (−1)k这个系数项,于是莫比乌斯函数就可能可以用于容斥系数。
其中 I I I, I d Id Id, I d k Id_k Idk均为完全积性函数。
一个有趣的性质:
若 f ( n ) f(n) f(n)为积性函数,则 f ( 1 ) = 1 f(1)=1 f(1)=1.
证明:因为 f ( n ) f(n) f(n)为积性函数,所以 f ( 1 × a ) = f ( 1 ) × f ( a ) f(1\times a)=f(1)\times f(a) f(1×a)=f(1)×f(a)
又因为 f ( 1 × a ) = f ( a ) f(1\times a)=f(a) f(1×a)=f(a),所以 f ( 1 ) × f ( a ) = f ( a ) f(1)\times f(a)=f(a) f(1)×f(a)=f(a),所以 f ( 1 ) = 1 f(1)=1 f(1)=1
根据定义,需证明 a a a与 b b b互质时, ϕ ( a × b ) = ϕ ( a ) × ϕ ( b ) \phi(a\times b)=\phi(a)\times \phi(b) ϕ(a×b)=ϕ(a)×ϕ(b).
设 x x x与 a b ab ab互质( x < a b x
{ x ≡ p m o d a x ≡ q m o d b \begin{cases}x\equiv p&\mod a\\x\equiv q&\mod b\end{cases} {x≡px≡qmodamodb
方程式的解的数量等于 ϕ ( a b ) \phi(ab) ϕ(ab)的值。
设 A b ≡ 1 m o d a , B a ≡ 1 m o d b Ab\equiv 1\mod a,Ba\equiv 1\mod b Ab≡1moda,Ba≡1modb
有 x ≡ A b p + B a q m o d a b x\equiv Abp+Baq \mod ab x≡Abp+Baqmodab,因为当 x = A b p + B a q x=Abp+Baq x=Abp+Baq时, x x x满足方程式。
p p p有 ϕ ( a ) \phi(a) ϕ(a)个不同取值, q q q有 ϕ ( b ) \phi(b) ϕ(b)个不同取值,若两对不同的 p , q p,q p,q和 p ′ , q ′ p',q' p′,q′,则 x x x有 ϕ ( a ) × ϕ ( b ) \phi(a)\times \phi(b) ϕ(a)×ϕ(b)个不同的取值。
又因为 x x x的取值的数量等于 ϕ ( a b ) \phi(ab) ϕ(ab),所以只需要证明一对 p , q p,q p,q有一个唯一对应的 x x x即可。
可以用反证法证否下列方程式:
{ p , q ≠ p ′ , q ′ x ≡ A b p + B a q m o d a b x ≡ A b p ′ + B a q ′ m o d a b \begin{cases}p,q\ne p',q'\\x\equiv Abp+Baq \mod ab\\x\equiv Abp'+Baq' \mod ab\end{cases} ⎩ ⎨ ⎧p,q=p′,q′x≡Abp+Baqmodabx≡Abp′+Baq′modab
有 A b p + B a q ≡ A b p ′ + B a q ′ m o d a b Abp+Baq\equiv Abp'+Baq'\mod ab Abp+Baq≡Abp′+Baq′modab
移项,得 A b ( p − p ′ ) ≡ B a ( q ′ − q ) m o d a b Ab(p-p')\equiv Ba(q'-q)\mod ab Ab(p−p′)≡Ba(q′−q)modab
两边同时乘 b b b, A b ( p − p ′ ) b ≡ B a ( q ′ − q ) b m o d a b Ab(p-p')b\equiv Ba(q'-q)b\mod ab Ab(p−p′)b≡Ba(q′−q)bmodab
由于右边为 a b ab ab的倍数,所以 A b ( p − p ′ ) ≡ 0 m o d a b Ab(p-p')\equiv 0\mod ab Ab(p−p′)≡0modab
若要满足此式,则左边为 a b ab ab的倍数。
观察左式, b b b提供了 b b b的倍数, a a a与 b b b互质,那么需要满足 A ( p − p ′ ) A(p-p') A(p−p′)为 a a a的倍数。
因为 A b ≡ 1 m o d a Ab\equiv 1\mod a Ab≡1moda,所以 A A A与 a a a互质。
所以有 p − p ′ p-p' p−p′为 a a a的倍数。
因为 p , p ′ ∈ Z a ∗ p,p'\in \Z^*_a p,p′∈Za∗,所以 p , p ′ < a p,p'p,p′<a,所以 p − p ′ = 0 p-p'=0 p−p′=0,即 p = p ′ p=p' p=p′,与假设矛盾,故可证明一对 p , q p,q p,q只有一个唯一对应的 x x x.
得证。
求解 [ 1 , n ] [1,n] [1,n]每个数的欧拉函数 ( 1 ≤ n ≤ 1 0 7 (1\le n\le 10^7 (1≤n≤107)
本题要求线性求欧拉函数,考虑到欧拉函数是积性函数,可以采用类似欧拉筛的方法解决。
ϕ ( i × p j ) = { ϕ ( i ) × p j i % p j = 0 ϕ ( i ) × ( p j − 1 ) i % p j ≠ 0 ( p j ∈ P , i ∈ N ) \phi(i\times p_j)=\begin{cases} \phi(i)\times p_j & i\% p_j=0\\ \phi(i)\times (p_j-1) & i\%p_j\ne 0\end{cases}(p_j\in P,i\in \N) ϕ(i×pj)={ϕ(i)×pjϕ(i)×(pj−1)i%pj=0i%pj=0(pj∈P,i∈N)
证明:
当 i % p j ≠ 0 i\%p_j\ne 0 i%pj=0,因为 p j ∈ P p_j\in P pj∈P,所以 p j p_j pj与 i i i互质,所以 ϕ ( i × p j ) = ϕ ( i ) × ϕ ( p j ) = ϕ ( i ) × ( p j − 1 ) \phi(i\times p_j)=\phi(i)\times \phi(p_j)=\phi(i)\times (p_j-1) ϕ(i×pj)=ϕ(i)×ϕ(pj)=ϕ(i)×(pj−1)
当 i % p j = 0 i\%p_j=0 i%pj=0,因为 ϕ ( n ) = n ∏ p ∣ n , p ∈ P ( 1 − 1 p ) \phi(n)=n\prod\limits_{p|n,p\in P}(1-\dfrac 1 p) ϕ(n)=np∣n,p∈P∏(1−p1),所以可以看出 ϕ ( n ) \phi(n) ϕ(n)仅与 n n n的质因子种类和 n n n的大小有关。
因为 i % p j = 0 i\%p_j=0 i%pj=0,所以 i i i中包含了 p j p_j pj这个质因子,所以 i i i的质因子种类与 i × p j i\times p_j i×pj完全相等,所以 ∏ p ′ ∣ ( i × p j ) , p ′ ∈ P ( 1 − 1 p ′ ) = ∏ p ′ ∣ i , p ′ ∈ P ( 1 − 1 p ′ ) \prod\limits_{p'|(i\times p_j),p'\in P}(1-\dfrac 1 {p'})=\prod\limits_{p'|i,p'\in P}(1-\dfrac 1 {p'}) p′∣(i×pj),p′∈P∏(1−p′1)=p′∣i,p′∈P∏(1−p′1)
有
ϕ ( i × p j ) = i × p j × ∏ p ′ ∣ ( i × p j ) , p ′ ∈ P ( 1 − 1 p ′ ) = p j × i × ∏ p ′ ∣ i , p ′ ∈ P ( 1 − 1 p ′ ) = ϕ ( i ) × p j \phi(i\times p_j)=i\times p_j\times\prod\limits_{p'|(i\times p_j),p'\in P}(1-\dfrac 1 {p'})=p_j\times i\times \prod\limits_{p'|i,p'\in P}(1-\dfrac 1 {p'})=\phi(i)\times p_j ϕ(i×pj)=i×pj×p′∣(i×pj),p′∈P∏(1−p′1)=pj×i×p′∣i,p′∈P∏(1−p′1)=ϕ(i)×pj
得证。
故有如下代码。
#include
using namespace std;
const int N = 1000005;
int n, pri[N], cnt = 0, vis[N], phi[N];
void oula(int x) {
phi[1] = 1;
for (int i = 2; i <= x; i++) {
if (!vis[i]) pri[++cnt] = i, phi[i] = i - 1;
for (int j = 1; j <= cnt && i * pri[j] <= x; j++) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) {
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
phi[i * pri[j]] = phi[i] * (pri[j] - 1); // 每个数只会被其最小质因子筛到一次
}
}
}
int main() {
scanf("%d", &n);
oula(n);
for (int i = 1; i <= n; i++) printf("%d ", phi[i]);
return 0;
}
思路同上。
μ ( i × p j ) = { 0 i % p j = 0 − μ ( i ) i % p j ≠ 0 \mu(i\times p_j)=\begin{cases}0&i\%p_j=0\\-\mu(i)&i\%p_j\ne 0\end{cases} μ(i×pj)={0−μ(i)i%pj=0i%pj=0
证明:
当 i % p j = 0 i\%p_j=0 i%pj=0时, i × p j i\times p_j i×pj至少有两个相同的质因子 p j p_j pj,根据定义, μ ( i × p j ) = 0 \mu(i\times p_j)=0 μ(i×pj)=0
当 i % p j ≠ 0 i\%p_j\ne 0 i%pj=0时,根据积性函数的定义, μ ( i × p j ) = μ ( i ) × μ ( p j ) = μ ( i ) × ( − 1 ) = − μ ( i ) \mu(i\times p_j)=\mu(i)\times \mu(p_j)=\mu(i)\times (-1)=-\mu(i) μ(i×pj)=μ(i)×μ(pj)=μ(i)×(−1)=−μ(i)
#include
using namespace std;
const int N = 1000005;
int n, pri[N], cnt = 0, vis[N], mu[N];
void oula(int x) {
mu[1] = 1;
for (int i = 2; i <= x; i++) {
if (!vis[i]) pri[++cnt] = i, mu[i] = -1;
for (int j = 1; j <= cnt && i * pri[j] <= x; j++) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) break; // 有两个相等的质因子pri[j],故mu值为0,不更新
mu[i * pri[j]] = -mu[i]; // 每个数只会被其最小质因子筛到一次
}
}
}
int main() {
scanf("%d", &n);
oula(n);
for (int i = 1; i <= n; i++) printf("%d ", mu[i]);
return 0;
}
下一篇:莫比乌斯反演-从入门到入土