容斥原理,莫比乌斯反演

文章介绍了莫比乌斯反演在组合计数中的原理及其在计算最大公约数问题中的应用,涉及到了数论中的公式推导和算法优化,如杜教筛法的使用。
摘要由CSDN通过智能技术生成

莫比乌斯反演

本文写的主要是有关于组合计数的莫比乌斯反演,关于纯数学处理的莫比乌斯反演请看莫比乌斯反演

莫比乌斯反演原理:
[ n = m ] = ∑ d ∣ n m μ ( d ) [n=m]=\underset{d|\frac nm}\sum \mu(d) [n=m]=dmnμ(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)=dng(d)g(n)=dnμ(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)=ndmg(d)g(n)=ndmμ(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)=kdmg(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)=kdmμ(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)=xdlog2ng(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) xdhx(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) xdKhx(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] xdKhx(d)=[x=K]
∑ d ∣ K x h x ( d x ) = [ K = x ] \underset{d|\frac Kx}\sum h_x(dx)=\left[K=x\right] dxKhx(dx)=[K=x]

我们知道有: [ n = m ] = ∑ d ∣ n m μ ( d ) [n=m]=\underset{d|\frac nm}\sum \mu(d) [n=m]=dmnμ(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) xdμ(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) xgcd(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(y1)

那么 f ( x ) = ∑ x ∣ d g ( d ) f(x)=\underset{x|d}{\sum}g(d) f(x)=xdg(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(n1)ig(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) (xRxL1)n=f(x)=xdg(d),其中 f ( x ) f(x) f(x)表示 x ∣ g c d x|gcd xgcd的情况数, 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)=xdμ(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>RL+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 (xRxL1)n=01,即 ( ⌊ R x ⌋ − ⌊ L − 1 x ⌋ ) 1 \left(\left\lfloor\frac R x\right\rfloor-\left\lfloor\frac {L-1}x\right\rfloor\right)^1 (xRxL1)1,于是还可以纯数论分块。

后记

于是皆大欢喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值