莫比乌斯反演
本文写的主要是有关于组合计数的莫比乌斯反演,关于纯数学处理的莫比乌斯反演请看莫比乌斯反演。
莫比乌斯反演原理:
[
n
=
m
]
=
∑
d
∣
n
m
μ
(
d
)
[n=m]=\underset{d|\frac nm}\sum \mu(d)
[n=m]=d∣mn∑μ(d)
莫比乌斯反演:
f
(
n
)
=
∑
d
∣
n
g
(
d
)
⇔
g
(
n
)
=
∑
d
∣
n
μ
(
d
)
f
(
n
d
)
f(n)=\underset{d|n}\sum g(d)\Leftrightarrow g(n)=\underset{d|n}\sum\mu(d)f(\frac nd)
f(n)=d∣n∑g(d)⇔g(n)=d∣n∑μ(d)f(dn)
f ( n ) = ∑ n ∣ d m g ( d ) ⇔ g ( n ) = ∑ n ∣ d m μ ( d n ) f ( d ) f(n)=\overset{m}{\underset{n|d}\sum} g(d)\Leftrightarrow g(n)=\overset{m}{\underset{n|d}\sum }\mu\left(\frac dn\right)f(d) f(n)=n∣d∑mg(d)⇔g(n)=n∣d∑mμ(nd)f(d)
URAL-1091-Tmutarakan Exams
给定
n
n
n个数,其数值取值范围为
[
1
,
m
]
[1,m]
[1,m],请问有多少种情况使得这
n
n
n个数的最大公约数为
1
1
1.
n
,
m
=
1
0
5
n,m=10^5
n,m=105
这题修正法比较好想:
如果不限制公约数关系,则答案为 m n m^n mn,这里面算重了不互质的情况,每种情况只多算了一次。
如果设
f
(
k
)
f(k)
f(k)表示这
n
n
n个数的最大公约数为
k
k
k的倍数的情况数,设
g
(
k
)
g(k)
g(k)表示这
n
n
n个数的最大公约数为
k
k
k的情况数,则:
(
m
/
k
)
n
=
f
(
k
)
=
∑
k
∣
d
m
g
(
d
)
{(m/k)}^{n}=f(k)=\overset{m}{\underset{k|d}\sum}g(d)
(m/k)n=f(k)=k∣d∑mg(d)
则: g ( k ) = ∑ k ∣ d m μ ( d n ) f ( d ) g(k)=\overset{m}{\underset{k|d}\sum}\mu\left(\frac dn \right)f(d) g(k)=k∣d∑mμ(nd)f(d)
答案为 g ( 1 ) g(1) g(1)
P9118
这个题可以考虑修正:
⌊
n
i
⌋
−
1
\lfloor\sqrt[i]{n}\rfloor-1
⌊in⌋−1表示
[
2
,
n
]
[2,n]
[2,n]当中完全
i
i
i次方数的个数(因为
1
k
=
1
1^k=1
1k=1,特判),会发现算重了,具体是这样算重的:
设
g
(
x
)
g(x)
g(x)表示
[
2
,
n
]
[2,n]
[2,n]当中能够表示为
a
x
a^x
ax并且不能表示为
b
y
(
y
>
x
)
b^y(y>x)
by(y>x)的数的个数,则
⌊
n
x
⌋
−
1
=
f
(
x
)
=
∑
x
∣
d
log
2
n
g
(
d
)
\lfloor\sqrt[x]{n}\rfloor-1=f(x)=\overset{\log{_2 n}}{\underset{x|d}\sum}g(d)
⌊xn⌋−1=f(x)=x∣d∑log2ng(d)
反演可以求出 g g g,求出 g g g的后缀和 + 1 +1 +1即为答案。
时间复杂度 O ( k log k ) O(k\log k) O(klogk)
还有另一种可以求出系数的修正:
考虑如何求出 g ( x ) g(x) g(x),设容斥系数为 h x ( d ) h_x(d) hx(d),答案应为 ∑ x ∣ d h x ( d ) ⋅ f ( d ) \underset{x|d}\sum h_x(d)\cdot f(d) x∣d∑hx(d)⋅f(d)
考虑一个实际上能够表示为
a
K
a^K
aK并且不能表示为
b
y
(
y
>
K
)
b^y(y>K)
by(y>K)的数的贡献为:
∑
x
∣
d
∣
K
h
x
(
d
)
\underset{x|d|K}\sum h_x(d)
x∣d∣K∑hx(d)
我们希望它等于
1
1
1,可以指定它在
x
=
K
x=K
x=K时做一次贡献,即:
∑
x
∣
d
∣
K
h
x
(
d
)
=
[
x
=
K
]
\underset{x|d|K}\sum h_x(d)=[x=K]
x∣d∣K∑hx(d)=[x=K]
∑
d
∣
K
x
h
x
(
d
x
)
=
[
K
=
x
]
\underset{d|\frac Kx}\sum h_x(dx)=\left[K=x\right]
d∣xK∑hx(dx)=[K=x]
我们知道有:
[
n
=
m
]
=
∑
d
∣
n
m
μ
(
d
)
[n=m]=\underset{d|\frac nm}\sum \mu(d)
[n=m]=d∣mn∑μ(d),也就是希望
h
x
(
d
x
)
=
μ
(
d
)
h_x(dx)=\mu(d)
hx(dx)=μ(d)
因此:
h
x
(
i
)
=
μ
(
i
x
)
h_x(i)=\mu\left(\frac ix\right)
hx(i)=μ(xi)
答案应为 ∑ x ∣ d μ ( d x ) ⋅ f ( d ) \underset{x|d}\sum \mu\left(\frac dx\right)\cdot f(d) x∣d∑μ(xd)⋅f(d)
CF1884D
首先补集转化为求有多少二元组是不好的。
考虑批量处理本质相同的情况。一个二元组的本质就是他们的 g c d gcd gcd。
这个题我赛时的思路是考虑修正。
f ( x ) f(x) f(x)表示 x ∣ g c d ( i , j ) x|gcd(i,j) x∣gcd(i,j)的二元组 ( i , j ) (i,j) (i,j)数量,设序列中有 y y y个数是 x x x的倍数,则 f ( x ) = y ( y − 1 ) 2 f(x)=\frac{y(y-1)}2 f(x)=2y(y−1)。
那么
f
(
x
)
=
∑
x
∣
d
g
(
d
)
f(x)=\underset{x|d}{\sum}g(d)
f(x)=x∣d∑g(d)
可以反演求出
g
(
x
)
g(x)
g(x)表示
x
=
g
c
d
x=gcd
x=gcd的二元数量。
答案为 n ( n − 1 ) 2 − ∑ i g ( i ) [ i 被至少一个数整除 ] \frac{n(n-1)}2-\underset{i}{\sum} g(i)[i被至少一个数整除] 2n(n−1)−i∑g(i)[i被至少一个数整除]
一点小细节是对于枚举倍数的时候记得对序列去重,不然对于一个全 1 1 1序列来说,枚举每个数的倍数,复杂度就不是调和数了。
P3172
容易想到修正,把倍数和恰好的关系式列出来:
(
⌊
R
x
⌋
−
⌊
L
−
1
x
⌋
)
n
=
f
(
x
)
=
∑
x
∣
d
g
(
d
)
\left(\left\lfloor\frac R x\right\rfloor-\left\lfloor\frac {L-1}x\right\rfloor\right)^n=f(x)=\underset{x|d}\sum g(d)
(⌊xR⌋−⌊xL−1⌋)n=f(x)=x∣d∑g(d),其中
f
(
x
)
f(x)
f(x)表示
x
∣
g
c
d
x|gcd
x∣gcd的情况数,
g
(
x
)
g(x)
g(x)表示
g
c
d
=
x
gcd=x
gcd=x的情况。
则: a n s = g ( K ) = ∑ x ∣ d μ ( d x ) f ( d ) ans=g(K)=\underset{x|d}\sum \mu\left(\frac dx\right)f(d) ans=g(K)=x∣d∑μ(xd)f(d)
杜教筛预处理莫比乌斯函数前缀和即可,可以做到 O ( H 2 3 ) O\left(H^{\frac 23}\right) O(H32)。
不过当时好像是2015年,可能杜教筛还不是很火,注意到 x > R − L + 1 x>R-L+1 x>R−L+1时 ( ⌊ R x ⌋ − ⌊ L − 1 x ⌋ ) n = 0 或 1 \left(\left\lfloor\frac R x\right\rfloor-\left\lfloor\frac {L-1}x\right\rfloor\right)^n=0或1 (⌊xR⌋−⌊xL−1⌋)n=0或1,即 ( ⌊ R x ⌋ − ⌊ L − 1 x ⌋ ) 1 \left(\left\lfloor\frac R x\right\rfloor-\left\lfloor\frac {L-1}x\right\rfloor\right)^1 (⌊xR⌋−⌊xL−1⌋)1,于是还可以纯数论分块。
后记
于是皆大欢喜。