【笔记】莫比乌斯反演(前置知识)

文章目录

  • 前言
  • 前置知识
          • 定义
          • 性质
      • 整除
          • 定义
          • 性质
      • 同余
          • 定义
          • 性质
      • 逆元
          • 定义
          • 性质
      • 积性函数
          • 定义
          • 常见的积性函数
          • 证明欧拉函数为积性函数
          • 例1:欧拉函数线性筛
          • 例2:莫比乌斯函数线性筛

前言

由于文章正文太长,不得不分几篇博客。

本篇为数论基础内容,学习过数论的可以跳过。

最近学了莫比乌斯反演和一点狄利克雷卷积,感觉很难,也是看了很多博客才有点明,写一篇博客帮助自己理解。

由于数论大多基于正整数讨论,故除特殊说明外,本文所有变量都为正整数。

前置知识

定义

模是一种运算,与加、减、乘、除、乘方、开方同为最常用的 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 mn,注意其中 n n n 为被除数, m m m为除数.

性质

1、若 a ∣ b , b ∣ c a|b,b|c ab,bc,则 a ∣ c a|c ac
证明:
基础。设 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 k2k1a=c,即 a ∣ c a|c ac.
这是整除证明中的大部分思路,将整除关系转化为倍数关系证明。
2、若 a ∣ b , a ∣ c a|b,a|c ab,ac,则 a ∣ b c a|bc abc
3、若 a ∣ c , b ∣ c a|c,b|c ac,bc a a a b b b互质,则 a b ∣ c ab|c abc
4、若 a ∣ b , b ∣ a a|b,b|a ab,ba,则 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 nmmodp.

性质

1、 a ≡ a m o d    p a\equiv a\mod p aamodp
2、若 a ≡ b m o d    p a\equiv b\mod p abmodp,则 b ≡ a m o d    p b\equiv a\mod p bamodp
3、若 n ≡ m m o d    p n\equiv m\mod p nmmodp 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+a1pm+a2pnmmodp
证明: 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+a1pnmodp 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 abmodp,cdmodp,则 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±cb±dmodp,acbdmodp
5、若 a c ≡ b c m o d    p , c ≠ 0 ac\equiv bc\mod p,c\ne 0 acbcmodp,c=0,则 a ≡ b m o d    p ( p , c ) a\equiv b\mod \dfrac p {(p,c)} abmod(p,c)p
6、若 a ≡ b m o d    p a\equiv b\mod p abmodp,则 a c ≡ b c m o d    p ac\equiv bc\mod p acbcmodp
7、若 a ≡ b m o d    p a\equiv b\mod p abmodp,则 a c ≡ b c m o d    p a^c\equiv b^c\mod p acbcmodp

逆元

定义

a b ≡ 1 m o d    p ab\equiv 1\mod p ab1modp,称 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 ba1modp,ab1modp.

可以认为 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 ab1modp a b = a ⋅ b − 1 \frac a b=a\cdot b^{-1} ba=ab1,即求 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 ap11modp
一般的题目求逆元多用这个定理,因为大部分题目的模数 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 ap11modp
a p − 2 ⋅ a ≡ 1 m o d    p a^{p-2}\cdot a\equiv 1\mod p ap2a1modp
所以 a a a在模 p p p意义下的逆元为 a p − 2   m o d   p a^{p-2}\bmod p ap2modp.

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=1n[(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)=p1(pP,p为质数)
费马小定理为欧拉定理的特殊情况,因为 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p1.

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 aba(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=1n[(i,n)=1]
引理1 ϕ ( p k ) = p k ( 1 − 1 p ) \phi(p^k)=p^k(1-\dfrac 1 p) ϕ(pk)=pk(1p1),其中 p ∈ P p\in P pP
证明:
我们知道, ϕ ( 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} pk1,因为 b p ≤ p k bp\le p^k bppk
所以 [ 1 , p k ] [1,p^k] [1,pk]中与 p k p^k pk不互质的数有 p k − 1 p^{k-1} pk1个。
所以 ϕ ( 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)=pkpk1=pk(1p1)

引理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)=npn,pP(1p1)
证明:

从反面思考或利用容斥原理易证————百度百科

用引理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)=ϕ(p1a1p2a2pkak)=ϕ(p1a1)ϕ(p2a2)ϕ(pkak)=p1a1(1p11)p2a2(1p21)pkak(1pk1)=npn,pP(1p1)
其中 p i ∈ P p_i\in P piP.

引理2较引理1更为常用。事实上,引理1是在证明引理2的过程中引出的。

引理3 n = ∑ d ∣ n ϕ ( d ) n=\sum\limits_{d|n}\phi(d) n=dnϕ(d)
证明:
f ( x ) = ∑ i = 1 n [ ( i , n ) = x ] f(x)=\sum\limits_{i=1}^n[(i,n)=x] f(x)=i=1n[(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=dnf(d)=dnϕ(dn).
注意这个式子有对称性,因为 d ∣ n d|n dn,所以 n d ∣ n \dfrac n d|n dnn.
所以 n = ∑ d ∣ n ϕ ( d ) n=\sum\limits_{d|n}\phi(d) n=dnϕ(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=p1p2pk(piP)p2n(pP)
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 xx<ab), p ∈ Z a ∗ , q ∈ Z b ∗ p\in \Z^*_a,q\in \Z^*_b pZa,qZb,其中 Z a ∗ \Z^*_a Za a a a的缩系(也称简化剩余系,即小于 a a a的正整数中与 a a a互质的数的集合)。则有如下方程式:
{ 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} {xpxqmodamodb
方程式的解的数量等于 ϕ ( 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 Ab1moda,Ba1modb
x ≡ A b p + B a q m o d    a b x\equiv Abp+Baq \mod ab xAbp+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,qxAbp+BaqmodabxAbp+Baqmodab
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+BaqAbp+Baqmodab
移项,得 A b ( p − p ′ ) ≡ B a ( q ′ − q ) m o d    a b Ab(p-p')\equiv Ba(q'-q)\mod ab Ab(pp)Ba(qq)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(pp)bBa(qq)bmodab
由于右边为 a b ab ab的倍数,所以 A b ( p − p ′ ) ≡ 0 m o d    a b Ab(p-p')\equiv 0\mod ab Ab(pp)0modab
若要满足此式,则左边为 a b ab ab的倍数。
观察左式, b b b提供了 b b b的倍数, a a a b b b互质,那么需要满足 A ( p − p ′ ) A(p-p') A(pp) a a a的倍数。
因为 A b ≡ 1 m o d    a Ab\equiv 1\mod a Ab1moda,所以 A A A a a a互质。
所以有 p − p ′ p-p' pp a a a的倍数。
因为 p , p ′ ∈ Z a ∗ p,p'\in \Z^*_a p,pZa,所以 p , p ′ < a p,p'p,p<a,所以 p − p ′ = 0 p-p'=0 pp=0,即 p = p ′ p=p' p=p,与假设矛盾,故可证明一对 p , q p,q p,q只有一个唯一对应的 x x x.
得证。

例1:欧拉函数线性筛

求解 [ 1 , n ] [1,n] [1,n]每个数的欧拉函数 ( 1 ≤ n ≤ 1 0 7 (1\le n\le 10^7 (1n107)

本题要求线性求欧拉函数,考虑到欧拉函数是积性函数,可以采用类似欧拉筛的方法解决。
ϕ ( 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)×(pj1)i%pj=0i%pj=0(pjP,iN)
证明:
i % p j ≠ 0 i\%p_j\ne 0 i%pj=0,因为 p j ∈ P p_j\in P pjP,所以 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)×(pj1)
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)=npn,pP(1p1),所以可以看出 ϕ ( 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),pP(1p1)=pi,pP(1p1)

ϕ ( 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),pP(1p1)=pj×i×pi,pP(1p1)=ϕ(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;
}
例2:莫比乌斯函数线性筛

思路同上。
μ ( 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;
}

下一篇:莫比乌斯反演-从入门到入土

你可能感兴趣的:(笔记,c++,算法)