一、莫比乌斯反演
莫比乌斯反演公式:
若
F(n)=∑i|nf(i)
则
f(n)=∑i|nμ(i)F(ni)
为什么呢?请看证明:
由于莫比乌斯函数具有性质
∑i|nμ(i)=[n=1]
,因此我们考虑把原式带入:
∑i|nμ(i)∑j|nif(i)=∑j|nf(j)∑i|njμ(i)=∑j|nf(j)[nj=1]=f(n)
证毕。
莫比乌斯反演的另一种形式:
若
F(n)=∑n|if(i)
则
f(n)=∑n|iμ(in)F(i)
证明过程与上面的相仿。
例题:BZOJ1101
给定
n,m,求∑i=1n∑j=1m[gcd(i,j)=k]
。
设
f(k)=∑i=1n∑j=1m[gcd(i,j)=k]
F(k)=∑k|if(i)=∑i=1n∑j=1m[k|gcd(i,j)]=⌊nk⌋⌊mk⌋
则根据莫比乌斯反演定理,
f(k)=∑k|iμ(ik)F(i)=∑k|iμ(ik)⌊ni⌋⌊mi⌋=∑i=1n/kμ(i)⌊nki⌋⌊mki⌋
于是变成了一个很显然的整除分块,复杂度
O(Tn−−√)
。
二、二项式反演
若
F(n)=∑i=pn(ni)f(i)
则
f(n)=∑i=pn(−1)n−i(ni)F(i)
证明如下:
∑i=pn(−1)n−i(ni)F(i)=∑i=pn(−1)n−i(ni)∑j=pn(ij)f(j)=∑j=pnf(j)∑i=jn(−1)n−i(ni)(ij)=∑j=pnf(j)(nj)∑i=jn(−1)n−i(n−ji−j)=∑j=pnf(j)(nj)∑i=0n−j(−1)n−j−i(n−ji)=∑j=pnf(j)(nj)⋅0n−j
最后一步是逆用二项式定理,展开
(1−1)n−j
,发现只有当
n=j
时
0n−j=1
,因此
∑j=pnf(j)(nj)⋅0n−j=f(n)
证毕。
另一种形式:若
g(m)=∑i=mn(im)f(i)
则
f(m)=∑i=mn(−1)i−m(im)g(i)
证明过程与上述过程相仿
例题
染色问题
有n个格子排成一排,用
m(m≥2)
种颜色染色,求使得相邻格子不能染上相同颜色,且每种颜色都要用上的染色方案数。
(m≤100,000,n≤109)
直接计算不好处理,考虑去掉某个限制条件。设
f(m)
为原题答案,
g(m)
为相同格子不能染上相同颜色,至多用m种的染色方案,则显然有
g(m)=m(m−1)n−1
。我们考虑使用
f
计算出
g
,可以枚举具体使用了哪些颜色,则:
g(m)=∑i=2m(mi)f(i)
根据二项式反演,我们就可以得到:
f(m)=∑i=2m(−1)m−i(mi)g(i)=∑i=2m(−1)m−i(mi)i(i−1)n−1
于是题目就可以在
O(mlogn)
的时间内解决。
洛谷8月月赛T4
给定一张
n×m(m≥n)
的棋盘,求在这个棋盘上放置
2n
个炮使得他们互不攻击的方案数。
(n≤m≤2,000或(m−n≤10且n≤m≤100,000))
分析题目,会发现每行必然出现两个炮。由于每列出现的数量也不超过2,考虑把原问题转化为:
给定
1到m共m
种数字,每种数字有两个。现在将它们组合成
n
对无序二元组,每个二元组当中两个数字不同的方案数。
原问题不方便直接计算,我们考虑把“每个二元组当中两个数字不同”的限制去掉。但由于原题求的是无序二元组,在不确定每个二元组中数字是否相同的情况下也非常难计算。于是我们把“无序二元组”变为“有序二元组”。
设
f(n,m)为原题答案,g(n,m)
为满足上述条件的方案数。考虑如何求
g(n,m)
。
注意到最特殊的情况就是有一些种类的数我们把两个全部选进去了,考虑我们选了多少个这样的数字,又有多少种填入的方案。剩下来的种类中必然是每种选择一个,填入剩下的格子中。于是我们有:
g(n,m)=∑i=0m(mi)A2i2n2iA2n−2im−i
于是
g(n,m)
便可以在
O(m)
的时间内计算出来。但是题目给
m−n≤10
的条件干什么呢?观察上述算式,会发现若
2i>2n或2n−2i>m−i时A2i2n或A2n−2im−i就为0了
,无需计算。
解上述不等式可以发现
2n−m≤i≤n
,因此我们只需要在
max(2n−m,0)≤i≤n
的范围中求解即可。
g(n,m)=∑i=max(2n−m,0)n(mi)A2i2n2iA2n−2im−i
这个范围大小就是
O(m−n)
级别的了。
我们再考虑如何通过
g(n,m)求出f(n,m)
。
f和g
之间一个非常大的区别就是要求二元组中的数字是否相同。我们考虑枚举有多少个二元组中数字相同,别忘了还要把无序变为有序。于是可以得到:
g(n,m)=∑i=0n(ni)Aim2n−if(n−i,m−i)
于是可以想到二项式反演。但是上面那个算式不方便于反演,我们可以稍微转化一下。
g(n,m)m!=∑i=0n(ni)2n−if(n−i,m−i)i!
考虑到无论是
f,g
,他们在题目中能够使用到的两个下标差值均为
n−m
。于是令:
F(i)=2if(i,i−n+m)(i−n+m)!,G(i)=g(i,i−n+m)(i−n+m)!
在加上组合数的左右值对称,于是上面的算式就变成二项式反演的模型了。
G(n)=∑i=0n(ni)F(n−i)=∑i=0n(ni)F(i)
F(n)=∑i=0n(−1)n−i(ni)G(i)
再根据
F,G
的定义,把
f,g
带入得到:
f(n,m)=m!2n∑i=0n(−1)i(ni)g(n−i,m−i)(m−i)!
至此,这道题目就可以在
O(min(n,m−n)×n)
的时间内解决了。
三、斯特林反演
第一类斯特林数
第一类斯特林数分为有符号和无符号两种,这里仅讨论无符号的情况。
下面记
s(n,k)
为无符号第一类斯特林数。
定义:
xn––=∏i=x−n+1xi=∑i=0n(−1)n−is(n,i)xi
也就是说,
有符号第一类斯特林数是
x
的
n
阶下降幂展开式的系数。
定义:
xn¯¯¯=∏i=xx+n−1i=∑i=0ns(n,i)xi
也就是说,
无符号第一类斯特林数是
x
的
n
阶上升幂展开式的系数。根据定义,我们可以使用分治NTT在
O(nlog2n)
的时间内预处理出第一类斯特林数。
组合数学性质:
s(n,k)
表示将
n个数划分为k
个无区别非空环的方案数。
递推式:
s(n,k)=s(n−1,k−1)+(n−1)s(n−1,k)
性质:
∑i=0ns(n,i)=n!
证明:我们假设一个
1到n排列为p
,定义一次置换为将
i位置上的数pi与pi
位置上的数字交换。则排列可以被划分为若干个环。如2,4,3,1,5,根据置换我们可以把排列分为(2,4,1),(3),(5)三个环。显然的,环的划分与每个排列一一对应,根据第一类斯特林数的组合数学性质,可以证明。
第二类斯特林数
定义:
S(n,k)
表示将n个数字分为k个无区别非空集合的方案数。
递推式:
S(n,k)=S(n−1,k−1)+kS(n−1,k)
根据定义,可以得到如下性质:
kn=∑i=1k(ki)S(n,i)i!
这个公式也比较好理解,我们排除掉非空的条件,并且把无区别变为有区别,枚举共有多少个非空集合即可。
于是根据二项式反演,我们可以得到
S(n,k)=1k!∑i=1k(−1)k−i(ki)in=∑i=0k(−1)k−i(k−i)!⋅ini!
因为
i
从0开始和从1开始没有什么区别。观察到最后的形式其实是一个卷积,因此我们可以通过NTT在
O(nlogn)
的时间内预处理数第二类斯特林数。
第二类斯特林数的性质还有一个表述,就是
kn=∑i=1n(ki)S(n,i)i!
也就是将
i的上界由k变为n
。其实也非常好理解,因为若
i>k,则(ki)=0;若n<k,则对于i>n也有S(n,i)=0
,不会影响计算结果。
利用第二类斯特林数的性质,我们可以处理出自然数幂和。
先证明一个引理:
∑i=mn(im)=(n+1n−m)(边界条件定义:若b<0或b>a则(ab)=0)
显然,当
n=0
时无论
m
取何非负整数都满足要求,或当
m=0时n
取任何非负整数也满足要求。接下来证明若
n,m和n,m+1满足,则n+1,m+1也满足
。
∑i=m+1n+1(im+1)=∑i=mn(im+1)+(im)=(n+1n−m)+(n+1n−m−1)=(n+2(n+1)−(m+1))
引理得证,接下来开始计算自然数幂和。
∑i=1nik=∑i=1n∑j=1min(i,k)(ij)S(k,j)j!=∑j=1kS(k,j)j!∑i=jn(ij)=∑j=1kS(k,j)j!(n+1n−j)=∑j=1kS(k,j)(n+1)j+1––––j+1
由于
(n+1)j+1––––
是由
j+1
个连续整数相乘,必然有一个为
j+1
的倍数。因此这种方法可以在
O(k2)
的时间内处理出任何模数下的自然数幂和。如果模数类似于998244353,我们可以先用NTT预处理出所有的第二类斯特林数,再预处理出
n+1
的下降幂和正整数逆元,可以在
O(klogk)
的时间计算出自然数幂和。
性质应用例题BZOJ2159
给定一棵树,每条边边权为1,对于每个节点
u,求∑i=1ndist(u,i)k
。
考虑应用第二类斯特林数的性质
∑i=1ndist(u,i)k=∑i=1n∑j=1kS(k,j)(dist(u,i)j)j!=∑j=1kS(k,j)j!∑i=1n(dist(u,i)j)
则对于每个节点,都计算出
∑i=1n(dist(u,i)j)
即可。我们分两次进行树形dp,第一次统计每个节点和它子树当中所有点的和,记为
f(u,j),则f(u,j)=∑v∈son[u]f(v,j−1)+f(v,j)
,第二次统计每个节点除子树外的所有节点的和,记为
g(u,j),则g(u,j)=g(fa[u],j)+g(fa[u],j−1)+∑v∈son[fa[u]]且v≠uf(v,j−2)+2f(v,j−1)+f(v,j)
,后面那个求和预处理一下
s(j)=∑v∈son[fa[u]]f(v,j)
,计算的时候减去自己即可。总复杂度
O(nk+k2)
。
反演公式
若
g(n)=∑i=mnS(n,i)f(i)
则
f(n)=∑i=mn(−1)n−is(n,i)g(i)
其中大写
S
表示第二类斯特林数,小写
s
表示第一类斯特林数。
证明:
∑i=mn(−1)n−is(n,i)g(i)
=∑i=mn(−1)n−is(n,i)∑j=miS(i,j)f(j)
=∑j=mnf(j)∑i=jn(−1)n−is(n,i)S(i,j)
考虑两类斯特林数的性质,有
xn––=∑i=1n(−1)n−is(n,i)xi=∑i=1n(−1)n−is(n,i)∑j=1iS(i,j)xj–
=∑j=1nxj–∑i=jn(−1)n−is(n,i)S(i,j)
根据上述等式,我们发现只有当
j=n
时后面算式的值才应当为1,其他时刻全为0.因此:
∑i=mn(−1)n−is(n,i)g(i)=f(n)
证毕。
我们其实会发现斯特林反演和二项式反演的形式很像,那二项式反演的第二种形式斯特林反演是否满足呢?满足。
g(m)=∑i=mnS(i,m)f(i),则f(m)=∑i=mn(−1)i−ms(i,m)g(i)
用类似二项式反演的办法可以得到
∑i=mn(−1)i−ms(i,m)g(i)=∑j=mnf(j)∑i=mj(−1)i−mS(j,i)s(i,m)
再次考虑他们的性质,换一种方法可以得到:
xn=∑i=1nS(n,i)xi–=∑i=1nS(n,i)∑j=1i(−1)i−js(i,j)xj
=∑j=1nxj∑i=jn(−1)i−jS(n,i)s(i,j)
仍然会有后面的部分为1当且仅当
j=n
。于是把这个性质带入回去,也就是把上式的
j
变为
m
,
n
变为
j
,就会发现只有当
j=m
的时候上式的值才为1.因此
∑j=mnf(j)∑i=mj(−1)i−mS(j,i)s(i,m)=f(m)
证毕。
例题BZOJ4617
定义两个结点数相同的图G1与图G2的异或为一个新的图G, 其中如果(u,v)在G1与G2中的出现次数之和为1, 那么边(u,v)在G中, 否则这条边不在G中.现在给定s个结点数相同的图G1…s, 设S=G1,G2,…,Gs, 请问S有多少个子集的异或为一个连通图?
直接做是不好做的,我们考虑差分(容斥)。发现节点数很小,于是可以想到去在节点数上面做手脚。定义
f(i)为异或图中连通块个数恰好为i的方案数,g(i)为异或图中连通块个数大于等于i的方案数。考虑怎么求g(i)
。
我们可以考虑枚举最终的连通块有哪些,此时花费的时间为n的贝尔数,最大为115975。此时我们限定枚举出的子集之间不能连边,子集内部随便连不连。枚举每一个子图,看看这个子图含有哪些子集之间的边,每个子图标记一个01串。我们最终要求这些01串异或起来的结果中有多少个为全0串。
可以把这些01串全部插入到线性基中,找出自由元的数量为
x,则方案数为2x
。为什么呢?对于任何一个自由元的子集,它们异或出来的结果必然也可以用主元代替,这就对应了一个全0串的情况。
于是我们用
O(bell(n)n2s)
的时间算出了所有的
g
,接下来算出
f
即可。
根据定义,有
g(m)=∑i=mnS(i,m)f(i)
因为计算的时候我们相当于把
i
个连通块划分成了
m
个子集。
于是根据斯特林反演,我们可以得到
f(m)=∑i=mn(−1)i−ms(i,m)g(i)
于是我们最终可以求出
f(1)
,整个问题便解决了。