数论中的欧拉函数

在数论中,对于一正整数 n n n欧拉函数 φ ( n ) \varphi(n) φ(n) 定义为 1 , 2 , ⋯   , n 1,2,\cdots,n 1,2,,n 中与 n n n 互质的数字的个数。

例如, φ ( 12 ) = 4 \varphi(12)=4 φ(12)=4 ,因为 1 , 5 , 7 , 11 1,5,7,11 1,5,7,11 12 12 12 互质。

前言

本文的前置知识包括数论、群论的基础内容。

本文讨论的函数都是算术函数,也就是定义域为正整数、陪域为复数的函数。

缺少欧拉函数是积性函数这一性质的证明。

表达式

首先,若 n = p k n=p^k n=pk p p p 是素数, k ⩾ 1 k\geqslant1 k1,由于 1 , 2 , ⋯   , p k 1,2,\cdots,p^k 1,2,,pk 中与 p k p^k pk 互质的数为不含有 p p p 因子的数,即除了 p , 2 p , 3 p ⋯   , p k p,2p,3p\cdots,p^{k} p,2p,3p,pk 以外的数,因此 φ ( n ) = φ ( p k ) = p k − p k − 1 \varphi(n)=\varphi(p^k)=p^k-p^{k-1} φ(n)=φ(pk)=pkpk1

其次,欧拉函数是积性函数,即,若 m , n m,n m,n 互质,则 φ ( m n ) = φ ( m ) φ ( n ) \varphi(mn)=\varphi(m)\varphi(n) φ(mn)=φ(m)φ(n)

因此,利用算术基本定理,若 n = p 1 k 1 ⋯ p r k r n=p_1^{k_1}\cdots p_r^{k_r} n=p1k1prkr ,则

φ ( n ) = φ ( ∏ i = 1 r p i k i ) = ∏ i = 1 r φ ( p i k i ) = ∏ i = 1 r ( p i k i − p i k i − 1 ) = ∏ i = 1 r p i k i ( 1 − 1 p i ) = n ∏ i = 1 r ( 1 − 1 p i ) = n ∏ p ∣ n ( 1 − 1 p ) \begin{aligned} \varphi(n)&=\varphi\left(\prod_{i=1}^r p_i^{k_i}\right)=\prod_{i=1}^r\varphi\left(p_i^{k_i}\right)=\prod_{i=1}^r\left(p_i^{k_i}-p_i^{k_i-1}\right)\\ &=\prod_{i=1}^rp_i^{k_i}\left(1-\frac{1}{p_i}\right)=n\prod_{i=1}^r\left(1-\frac{1}{p_i}\right)=n\prod_{p\mid n}\left(1-\frac1p\right) \end{aligned} φ(n)=φ(i=1rpiki)=i=1rφ(piki)=i=1r(pikipiki1)=i=1rpiki(1pi1)=ni=1r(1pi1)=npn(1p1)
事实上,我们还可以这样考虑:

n = p 1 k 1 ⋯ p r k r n=p_1^{k_1}\cdots p_r^{k_r} n=p1k1prkr ,定义集合 A = { 1 , 2 , ⋯   , n } A=\{1,2,\cdots,n\} A={1,2,,n} 为全集,集合 A i A_i Ai 的元素为 1 ∼ n 1\sim n 1n 中被 p i p_i pi 整除的数,集合 S S S 的元素为 1 ∼ n 1\sim n 1n 中与 n n n 互质的数,也就是不被任何 p i p_i pi 整除的数,因此有
S = A − ⋃ i = 1 r A i ⇒ ∣ S ∣ = ∣ A ∣ − ∣ ⋃ i = 1 r A i ∣ ⇒ φ ( n ) = n − ∣ ⋃ i = 1 r A i ∣ S=A-\bigcup_{i=1}^{r}A_i\Rightarrow |S|=|A|-\left|\bigcup_{i=1}^{r}A_i\right| \Rightarrow\varphi(n)=n-\left|\bigcup_{i=1}^{r}A_i\right| S=Ai=1rAiS=Ai=1rAiφ(n)=ni=1rAi
而我们知道以下两个事实:
∣ A i ∣ = n p i , ∣ A i ∩ A j ∣ = n p i p j |A_i|=\frac{n}{p_i},|A_i\cap A_j|=\frac{n}{p_ip_j} Ai=pin,AiAj=pipjn
那么根据容斥原理,
∣ ⋃ i = 1 r A i ∣ = ∑ i = 1 r ∣ A i ∣ − ∑ 1 ⩽ i < j ⩽ r ∣ A i ∩ A j ∣ + ⋯ = ∑ i n p i − ∑ i , j n p i p j + ⋯ \left|\bigcup_{i=1}^{r}A_i\right|=\sum_{i=1}^{r}|A_i|-\sum_{1\leqslant ii=1rAi=i=1rAi1i<jrAiAj+=ipini,jpipjn+
因此有
φ ( n ) = n − ∑ i n p i + ∑ i , j n p i p j − ⋯ ( ∗ ) \varphi(n)=n-\sum_{i}\frac{n}{p_{i}}+\sum_{i,j}\frac{n}{p_ip_j}-\cdots\tag{$\ast$} φ(n)=nipin+i,jpipjn()

性质

引入莫比乌斯函数 μ \mu μ
μ ( n ) = { 1 若  n = 1 ( − 1 ) k 若  n  无平方数因数,且  n = p 1 p 2 ⋯ p k 0 若  n  有大于  1  的平方数因数 \mu(n)=\begin{cases} 1 & \text{若 $n=1$}\\ (-1)^k & \text{若 $n$ 无平方数因数,且 $n=p_1p_2\cdots p_k$}\\ 0 & \text{若 $n$ 有大于 $1$ 的平方数因数} \end{cases} μ(n)=1(1)k0 n=1 n 无平方数因数,且 n=p1p2pk n 有大于 1 的平方数因数
μ \mu μ 的定义容易看出它也是个积性函数。

我们可以用 μ ( n ) \mu(n) μ(n) ( ∗ ) (\ast) () 式改写为
φ ( n ) = n − ∑ i n p i + ∑ i , j n p i p j − ⋯ = ∑ d ∣ n μ ( d ) n d (1) \varphi(n)=n-\sum_{i}\frac{n}{p_{i}}+\sum_{i,j}\frac{n}{p_ip_j}-\cdots=\sum_{d\mid n}\mu(d)\frac{n}{d}\tag{1} φ(n)=nipin+i,jpipjn=dnμ(d)dn(1)
考虑到 ( 1 ) (1) (1) 式的形式,我们再引入迪利克雷卷积,对于函数 f , g f,g f,g ,其迪利克雷卷积定义为
( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f\ast g)(n)=\sum_{d\mid n}f(d)g\left(\frac nd\right) (fg)(n)=dnf(d)g(dn)
容易看出,迪利克雷卷积满足交换律、结合律和分配律。

( 1 ) (1) (1) 式用迪利克雷卷积表示,即为:
φ = μ ∗ Id ⁡ (2) \varphi=\mu\ast\operatorname{Id}\tag{2} φ=μId(2)
其中 Id ⁡ \operatorname{Id} Id恒等函数,对于任意的 n n n ,有 Id ⁡ ( n ) = n \operatorname{Id}(n)=n Id(n)=n

记模 n n n 加法群为 Z / n Z \mathbb{Z}/n\mathbb{Z} Z/nZ 。我们考虑 Z / n Z \mathbb{Z}/n\mathbb{Z} Z/nZ 中生成元的个数。由于 1 1 1 一定是生成元,因此数 a a a 是生成元,当且仅当存在一整数 b b b ,使得 a b ≡ 1 ( m o d n ) ab\equiv1\pmod n ab1(modn) 。由裴蜀定理, gcd ⁡ ( a , n ) = 1 \gcd(a,n)=1 gcd(a,n)=1 。因此 a a a 是生成元当且仅当 a a a n n n 互质。

因此 Z / n Z \mathbb{Z}/n\mathbb{Z} Z/nZ 中生成元的个数即为 φ ( n ) \varphi(n) φ(n) 。设 Z / d Z \mathbb{Z}/d\mathbb{Z} Z/dZ Z / n Z \mathbb{Z}/n\mathbb{Z} Z/nZ 的一个子群,由拉格朗日定理 d ∣ n d\mid n dn 。由于不同的子群具有不同的生成元,则不同子群之间无交。因此有
∑ d ∣ n φ ( d ) = n (3) \sum_{d\mid n}\varphi(d)=n\tag{3} dnφ(d)=n(3)
定义常函数 I ( n ) ≡ 1 I(n)\equiv1 I(n)1 ,则 ( 3 ) (3) (3) 式可用迪利克雷卷积表示为
φ ∗ I = Id ⁡ (4) \varphi\ast I=\operatorname{Id}\tag{4} φI=Id(4)
迪利克雷卷积可看成二元运算,容易看出,该运算的幺元为单位函数 ϵ \epsilon ϵ
ϵ ( n ) = { 1 若  n = 1 0 其他情况 \epsilon(n)=\begin{cases} 1 & \text{若 $n=1$}\\ 0 & \text{其他情况} \end{cases} ϵ(n)={10 n=1其他情况
则对于任意算术函数 f f f
f = f ∗ ϵ = ϵ ∗ f f=f\ast\epsilon=\epsilon\ast f f=fϵ=ϵf
定义算数函数 f f f逆函数 f − 1 f^{-1} f1 为满足 f ∗ f − 1 = ϵ f\ast f^{-1}=\epsilon ff1=ϵ 的函数。

对比 ( 2 ) (2) (2) 式和 ( 4 ) (4) (4) 式,可得 μ \mu μ 的逆函数为 I I I,即
μ ∗ I = ϵ \mu\ast I=\epsilon μI=ϵ
( 2 ) (2) (2) 式和 ( 4 ) (4) (4) 式的关系作推广,假设对于函数 f ( n ) f(n) f(n) F ( n ) F(n) F(n) 有如下关系式:
F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d\mid n}f(d) F(n)=dnf(d)
则有
f ( n ) = ∑ d ∣ n F ( d ) μ ( n d ) f(n)=\sum_{d\mid n}F(d)\mu\left(\frac{n}{d}\right) f(n)=dnF(d)μ(dn)
这就是所谓的莫比乌斯反演公式

应用

一、求 1 ∼ n ! 1\sim n! 1n! 中有多少个整数 x x x ,满足 x x x 的所有素因子都大于 m m m ,其中 m ⩽ n m\leqslant n mn

x x x 的所有素因子都大于 m m m 等价于 gcd ⁡ ( x , m ! ) = 1 \gcd(x,m!)=1 gcd(x,m!)=1 。因此本题等价于求 ∑ x = 1 n ! [ gcd ⁡ ( x , m ! ) = 1 ] \sum_{x=1}^{n!}[\gcd(x,m!)=1] x=1n![gcd(x,m!)=1]

由辗转相除法, gcd ⁡ ( x , m ! ) = gcd ⁡ ( x   m o d   m ! , m ! ) \gcd(x,m!)=\gcd(x\bmod m!,m!) gcd(x,m!)=gcd(xmodm!,m!) 。由于 m ⩽ n m\leqslant n mn ,因此 m ! ∣ n ! m!\mid n! m!n!

因此答案即为 φ ( m ! ) n ! m ! \varphi(m!)\frac{n!}{m!} φ(m!)m!n!

二、求满足 gcd ⁡ ( a , b ) = gcd ⁡ ( a + x , b ) \gcd(a,b)=\gcd(a+x,b) gcd(a,b)=gcd(a+x,b) 0 ⩽ x < b 0\leqslant x0x<b x x x 数量。

由辗转相除法,本题即为求解满足 gcd ⁡ ( a , b ) = gcd ⁡ ( ( a + x )   m o d   b , b ) \gcd(a,b)=\gcd\left((a+x)\bmod b,b\right) gcd(a,b)=gcd((a+x)modb,b) x x x 数量,即满足 gcd ⁡ ( a , b ) = gcd ⁡ ( x ′ , b ) \gcd(a,b)=\gcd(x',b) gcd(a,b)=gcd(x,b) x ′ x' x 数量。其中 0 ⩽ x ′ < b 0\leqslant x'0x<b

gcd ⁡ ( a , b ) = gcd ⁡ ( x ′ , b ) = d \gcd(a,b)=\gcd(x',b)=d gcd(a,b)=gcd(x,b)=d ,则 gcd ⁡ ( x ′ / d , b / d ) = 1 \gcd(x'/d,b/d)=1 gcd(x/d,b/d)=1

因此最终的答案即为 φ ( b / d ) \varphi\left(b/d\right) φ(b/d)

三、求 f ( n ) = ∑ i = 1 n gcd ⁡ ( i , n ) \displaystyle f(n)=\sum_{i=1}^n\gcd(i,n) f(n)=i=1ngcd(i,n)

gcd ⁡ ( i , n ) = d \gcd(i,n)=d gcd(i,n)=d ,则 gcd ⁡ ( i / d , n / d ) = 1 \gcd(i/d,n/d)=1 gcd(i/d,n/d)=1 。满足 gcd ⁡ ( i , n ) = d \gcd(i,n)=d gcd(i,n)=d i i i 的个数即为满足 gcd ⁡ ( i / d , n / d ) = 1 \gcd(i/d,n/d)=1 gcd(i/d,n/d)=1 i i i 的个数,也就是 φ ( n / d ) \varphi(n/d) φ(n/d) 。因此最终的答案即为
f ( n ) = ∑ d ∣ n d ⋅ φ ( n d ) f(n)=\sum_{d\mid n}d\cdot\varphi\left(\frac{n}{d}\right) f(n)=dndφ(dn)
n n n 太大,不能预处理所有的 φ ( i ) \varphi(i) φ(i) ,则需要做以下分解:
f ( p k ) = ∑ i = 0 k p i ⋅ φ ( p k − i ) = ∑ i = 0 k − 1 p i ⋅ p k − i − 1 ( p − 1 ) + p k = p k − 1 ( k p + p − k ) f ( n ) = f ( ∏ i = 1 r p k i ) = ∏ i = 1 r f ( p k i ) = ∏ i = 1 r ( p i k i − 1 ( k i p i + p i − k i ) ) f(p^k)=\sum_{i=0}^kp^i\cdot\varphi\left(p^{k-i}\right)=\sum_{i=0}^{k-1}p^i\cdot p^{k-i-1}(p-1)+p^k=p^{k-1}(kp+p-k)\\f(n)=f\left(\prod_{i=1}^rp^{k_i}\right)=\prod_{i=1}^rf(p^{k_i})=\prod_{i=1}^r\left(p_i^{k_i-1}(k_ip_i+p_i-k_i)\right) f(pk)=i=0kpiφ(pki)=i=0k1pipki1(p1)+pk=pk1(kp+pk)f(n)=f(i=1rpki)=i=1rf(pki)=i=1r(piki1(kipi+piki))
四、求 ∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = k ] \displaystyle \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=k] i=1nj=1m[gcd(i,j)=k]
∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = k ] = ∑ i = 1 ⌊ n / k ⌋ ∑ j = 1 ⌊ m / k ⌋ [ gcd ⁡ ( i , j ) = 1 ] = ∑ i = 1 ⌊ n / k ⌋ ∑ j = 1 ⌊ m / k ⌋ ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) = ∑ d = 1 ⌊ min ⁡ ( n , m ) / k ⌋ μ ( d ) ∑ i = 1 ⌊ n / k ⌋ [ d ∣ i ] ∑ j = 1 ⌊ m / k ⌋ [ d ∣ j ] = ∑ d = 1 ⌊ min ⁡ ( n , m ) / k ⌋ μ ( d ) ⌊ n k d ⌋ ⌊ m k d ⌋ \begin{aligned}&\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=k]\\=&\sum_{i=1}^{\lfloor n/k\rfloor}\sum_{j=1}^{\lfloor m/k\rfloor}[\gcd(i,j)=1]\\=&\sum_{i=1}^{\lfloor n/k\rfloor}\sum_{j=1}^{\lfloor m/k\rfloor}\sum_{d\mid\gcd(i,j)}\mu(d)\\=&\sum_{d=1}^{\lfloor \min(n,m)/k\rfloor}\mu(d)\sum_{i=1}^{\lfloor n/k\rfloor}[d\mid i]\sum_{j=1}^{\lfloor m/k\rfloor}[d\mid j]\\=&\sum_{d=1}^{\lfloor \min(n,m)/k\rfloor}\mu(d)\left\lfloor\frac{n}{kd}\right\rfloor\left\lfloor\frac{m}{kd}\right\rfloor\end{aligned} ====i=1nj=1m[gcd(i,j)=k]i=1n/kj=1m/k[gcd(i,j)=1]i=1n/kj=1m/kdgcd(i,j)μ(d)d=1min(n,m)/kμ(d)i=1n/k[di]j=1m/k[dj]d=1min(n,m)/kμ(d)kdnkdm
下面用分块计算即可。

注:数论分块

对于含有 ⌊ n / i ⌋ \lfloor n/i\rfloor n/i 的求和式,对于每个 i i i ,找到最大的 j j j 使得 ⌊ n / i ⌋ = ⌊ n / j ⌋ \lfloor n/i\rfloor=\lfloor n/j\rfloor n/i=n/j ,则每次以 [ i , j ] [i,j] [i,j] 为一块求和即可。 j j j 的求法如下:
⌊ n i ⌋ ⩽ n i ⇔ ⌊ n ⌊ n i ⌋ ⌋ ⩾ ⌊ n n i ⌋ = ⌊ i ⌋ = i ⇔ i ⩽ ⌊ n ⌊ n i ⌋ ⌋ ⇒ j = ⌊ n ⌊ n i ⌋ ⌋ \left\lfloor\frac{n}{i}\right\rfloor\leqslant\frac{n}{i}\Leftrightarrow\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\geqslant\left\lfloor\frac{n}{\frac ni}\right\rfloor=\lfloor i\rfloor=i\Leftrightarrow i\leqslant\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\\\Rightarrow j=\left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor inininninn=i=iiinnj=inn

五、求 ∑ i = 1 n ∑ j = 1 m φ ( i j ) φ ( i ) φ ( j ) \displaystyle \sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(ij)}{\varphi(i)\varphi(j)} i=1nj=1mφ(i)φ(j)φ(ij)
φ ( i j ) φ ( i ) φ ( j ) = i j ∏ p ∣ i j ( 1 − 1 p ) i ∏ p ∣ i ( 1 − 1 p ) j ∏ p ∣ j ( 1 − 1 p ) = 1 ∏ p ∣ gcd ⁡ ( i , j ) ( 1 − 1 p ) = gcd ⁡ ( i , j ) φ ( gcd ⁡ ( i , j ) ) \frac{\varphi(ij)}{\varphi(i)\varphi(j)}=\frac{\displaystyle ij\prod_{p\mid ij}\left(1-\frac 1p\right)}{\displaystyle i\prod_{p\mid i}\left(1-\frac 1p\right)j\prod_{p\mid j}\left(1-\frac 1p\right)}=\frac{1}{\displaystyle \prod_{p\mid\gcd(i,j)}\left(1-\frac 1p\right)}=\frac{\gcd(i,j)}{\varphi(\gcd(i,j))} φ(i)φ(j)φ(ij)=ipi(1p1)jpj(1p1)ijpij(1p1)=pgcd(i,j)(1p1)1=φ(gcd(i,j))gcd(i,j)
因此原式可化简为
∑ i = 1 n ∑ j = 1 m φ ( i j ) φ ( i ) φ ( j ) = ∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) φ ( gcd ⁡ ( i , j ) ) = ∑ k = 1 min ⁡ ( n , m ) k φ ( k ) ∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = k ] = ∑ k = 1 min ⁡ ( n , m ) k φ ( k ) ∑ d = 1 ⌊ min ⁡ ( n , m ) / k ⌋ μ ( d ) ⌊ n k d ⌋ ⌊ m k d ⌋ \begin{aligned}&\sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(ij)}{\varphi(i)\varphi(j)}\\=&\sum_{i=1}^n\sum_{j=1}^m\frac{\gcd(i,j)}{\varphi(\gcd(i,j))}\\=&\sum_{k=1}^{\min(n,m)}\frac{k}{\varphi(k)}\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]\\=&\sum_{k=1}^{\min(n,m)}\frac{k}{\varphi(k)}\sum_{d=1}^{\lfloor \min(n,m)/k\rfloor}\mu(d)\left\lfloor\frac{n}{kd}\right\rfloor\left\lfloor\frac{m}{kd}\right\rfloor\end{aligned} ===i=1nj=1mφ(i)φ(j)φ(ij)i=1nj=1mφ(gcd(i,j))gcd(i,j)k=1min(n,m)φ(k)ki=1nj=1m[gcd(i,j)=k]k=1min(n,m)φ(k)kd=1min(n,m)/kμ(d)kdnkdm

下面只需预处理 k / φ ( k ) k/\varphi(k) k/φ(k) μ ( d ) \mu(d) μ(d) 即可。若时间限制较紧,预处理 k / φ ( k ) k/\varphi(k) k/φ(k) 时需要先预处理出逆元。

注:线性预处理逆元

inv ⁡ ( i ) \operatorname{inv}(i) inv(i) 表示 i i i p p p 的逆元,若 p = k i + j p=ki+j p=ki+j ,其中 k k k 是整数, j < i jj<i ,则有 k i + j ≡ 0 ( m o d p ) ki+j\equiv0\pmod p ki+j0(modp) 。两边同乘 i − 1 j − 1 i^{-1}j^{-1} i1j1 ,有 k j − 1 + i − 1 ≡ 0 ( m o d p ) kj^{-1}+i^{-1}\equiv0\pmod p kj1+i10(modp)

因此 i − 1 ≡ − k j − 1 ( m o d p ) i^{-1}\equiv-kj^{-1}\pmod p i1kj1(modp) 。其中, k = ⌊ p / i ⌋ k=\lfloor p/i\rfloor k=p/i j = p   m o d   i j=p\bmod i j=pmodi 。则
inv ⁡ ( i ) = − ⌊ p / i ⌋ inv ⁡ ( p   m o d   i ) \operatorname{inv}(i)=-\lfloor p/i\rfloor\operatorname{inv}(p\bmod i) inv(i)=p/iinv(pmodi)
代码实现如下:

const int N = 1e5 + 5;
int inv[N];
void init(){
    inv[1] = 1;
    for (int i = 2; i < N; ++i)
        inv[i] = (MOD -  MOD / i) * inv[MOD % i] % MOD;
}

代码实现

借助欧拉筛预处理 φ ( n ) \varphi(n) φ(n) μ ( n ) \mu(n) μ(n) 的方法:

const int N = 1e5 + 5;
vector<int> pri;
bool npr[N];
int phi[N];
short int mu[N];
void euler(){ // O(n)
    memset(npr, false, sizeof(npr));
    mu[1] = 1;
    for (int i = 2; i < N; ++i){
        if (!npr[i]){
            pri.emplace_back(i);
            phi[i] = i - 1;
            mu[i] = -1;
        }
        for (int p: pri){
            int k = i * p;
            if (k >= N) break;
            npr[k] = true;
            if (i % p == 0){
                phi[k] = phi[i] * p;
                mu[k] = 0;
                break;
            }
            phi[k] = phi[i] * (p - 1);
            mu[k] = -mu[i];
        }
    }
}

不用筛法预处理 φ ( n ) \varphi(n) φ(n) μ ( n ) \mu(n) μ(n) 的方法:

const int N = 1e5 + 5;
int phi[N];
void get_phi() { // O(nloglogn)
    for (int i = 2; i < N; ++i) if (!phi[i])
        for (int j = i; j < N; j += i){
            if (!phi[j]) phi[j] = 1;
            phi[j] -= phi[j] / i;
        }
}
short int mu[N];
void get_mu() { // O(nlogn)
    mu[1] = 1;
    for (int i = 1; i < N; ++i)
        for (int j = i + i; j < N; j += i)
            mu[j] -= mu[i];
}

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