反演定理及其应用

一、莫比乌斯反演

莫比乌斯反演公式:

F ( n ) = i | n f ( i )


f ( n ) = i | n μ ( i ) F ( n i )

为什么呢?请看证明:
由于莫比乌斯函数具有性质 i | n μ ( i ) = [ n = 1 ] ,因此我们考虑把原式带入:
i | n μ ( i ) j | n i f ( i ) = j | n f ( j ) i | n j μ ( i ) = j | n f ( j ) [ n j = 1 ] = f ( n )

证毕。
莫比乌斯反演的另一种形式:

F ( n ) = n | i f ( i )


f ( n ) = n | i μ ( i n ) F ( i )

证明过程与上面的相仿。

例题:BZOJ1101

给定 n , m i = 1 n j = 1 m [ g c d ( i , j ) = k ]

f ( k ) = i = 1 n j = 1 m [ g c d ( i , j ) = k ]
F ( k ) = k | i f ( i ) = i = 1 n j = 1 m [ k | g c d ( i , j ) ] = n k m k

则根据莫比乌斯反演定理,
f ( k ) = k | i μ ( i k ) F ( i ) = k | i μ ( i k ) n i m i = i = 1 n / k μ ( i ) n k i m k i

于是变成了一个很显然的整除分块,复杂度 O ( T n )

二、二项式反演

F ( n ) = i = p n ( n i ) f ( i )

f ( n ) = i = p n ( 1 ) n i ( n i ) F ( i )

证明如下:
i = p n ( 1 ) n i ( n i ) F ( i ) = i = p n ( 1 ) n i ( n i ) j = p n ( i j ) f ( j ) = j = p n f ( j ) i = j n ( 1 ) n i ( n i ) ( i j ) = j = p n f ( j ) ( n j ) i = j n ( 1 ) n i ( n j i j ) = j = p n f ( j ) ( n j ) i = 0 n j ( 1 ) n j i ( n j i ) = j = p n f ( j ) ( n j ) · 0 n j

最后一步是逆用二项式定理,展开 ( 1 1 ) n j ,发现只有当 n = j 0 n j = 1 ,因此
j = p n f ( j ) ( n j ) · 0 n j = f ( n )

证毕。
另一种形式:若
g ( m ) = i = m n ( i m ) f ( i )
f ( m ) = i = m n ( 1 ) i m ( i m ) g ( i )

证明过程与上述过程相仿

例题

染色问题

有n个格子排成一排,用 m ( m 2 ) 种颜色染色,求使得相邻格子不能染上相同颜色,且每种颜色都要用上的染色方案数。 ( m 100 , 000 , n 10 9 )
直接计算不好处理,考虑去掉某个限制条件。设 f ( m ) 为原题答案, g ( m ) 为相同格子不能染上相同颜色,至多用m种的染色方案,则显然有 g ( m ) = m ( m 1 ) n 1 。我们考虑使用 f 计算出 g ,可以枚举具体使用了哪些颜色,则:

g ( m ) = i = 2 m ( m i ) f ( i )

根据二项式反演,我们就可以得到:
f ( m ) = i = 2 m ( 1 ) m i ( m i ) g ( i ) = i = 2 m ( 1 ) m i ( m i ) i ( i 1 ) n 1

于是题目就可以在 O ( m l o g n ) 的时间内解决。

洛谷8月月赛T4

给定一张 n × m ( m n ) 的棋盘,求在这个棋盘上放置 2 n 个炮使得他们互不攻击的方案数。
( 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 = 0 m ( m i ) A 2 n 2 i 2 i A m i 2 n 2 i

于是 g ( n , m ) 便可以在 O ( m ) 的时间内计算出来。但是题目给 m n 10 的条件干什么呢?观察上述算式,会发现若 2 i > 2 n 2 n 2 i > m i A 2 n 2 i A m i 2 n 2 i 0 ,无需计算。
解上述不等式可以发现 2 n m i n ,因此我们只需要在 m a x ( 2 n m , 0 ) i n 的范围中求解即可。
g ( n , m ) = i = m a x ( 2 n m , 0 ) n ( m i ) A 2 n 2 i 2 i A m i 2 n 2 i

这个范围大小就是 O ( m n ) 级别的了。
我们再考虑如何通过 g ( n , m ) f ( n , m ) f g 之间一个非常大的区别就是要求二元组中的数字是否相同。我们考虑枚举有多少个二元组中数字相同,别忘了还要把无序变为有序。于是可以得到:
g ( n , m ) = i = 0 n ( n i ) A m i 2 n i f ( n i , m i )

于是可以想到二项式反演。但是上面那个算式不方便于反演,我们可以稍微转化一下。
g ( n , m ) m ! = i = 0 n ( n i ) 2 n i f ( n i , m i ) i !

考虑到无论是 f , g ,他们在题目中能够使用到的两个下标差值均为 n m 。于是令:
F ( i ) = 2 i f ( i , i n + m ) ( i n + m ) ! G ( i ) = g ( i , i n + m ) ( i n + m ) !

在加上组合数的左右值对称,于是上面的算式就变成二项式反演的模型了。
G ( n ) = i = 0 n ( n i ) F ( n i ) = i = 0 n ( n i ) F ( i )

F ( n ) = i = 0 n ( 1 ) n i ( n i ) G ( i )

再根据 F , G 的定义,把 f , g 带入得到:
f ( n , m ) = m ! 2 n i = 0 n ( 1 ) i ( n i ) g ( n i , m i ) ( m i ) !

至此,这道题目就可以在 O ( m i n ( n , m n ) × n ) 的时间内解决了。

三、斯特林反演

第一类斯特林数

第一类斯特林数分为有符号和无符号两种,这里仅讨论无符号的情况。
下面记 s ( n , k ) 为无符号第一类斯特林数。
定义:

x n _ = i = x n + 1 x i = i = 0 n ( 1 ) n i s ( n , i ) x i

也就是说, 有符号第一类斯特林数是 x n 阶下降幂展开式的系数。
定义:
x n ¯ = i = x x + n 1 i = i = 0 n s ( n , i ) x i

也就是说, 无符号第一类斯特林数是 x n 阶上升幂展开式的系数。根据定义,我们可以使用分治NTT在 O ( n l o g 2 n ) 的时间内预处理出第一类斯特林数。
组合数学性质: s ( n , k ) 表示将 n k 个无区别非空环的方案数。
递推式:
s ( n , k ) = s ( n 1 , k 1 ) + ( n 1 ) s ( n 1 , k )

性质:
i = 0 n s ( n , i ) = n !

证明:我们假设一个 1 n p ,定义一次置换为将 i p i p i 位置上的数字交换。则排列可以被划分为若干个环。如2,4,3,1,5,根据置换我们可以把排列分为(2,4,1),(3),(5)三个环。显然的,环的划分与每个排列一一对应,根据第一类斯特林数的组合数学性质,可以证明。

第二类斯特林数

定义: S ( n , k ) 表示将n个数字分为k个无区别非空集合的方案数。
递推式:

S ( n , k ) = S ( n 1 , k 1 ) + k S ( n 1 , k )

根据定义,可以得到如下性质:
k n = i = 1 k ( k i ) S ( n , i ) i !

这个公式也比较好理解,我们排除掉非空的条件,并且把无区别变为有区别,枚举共有多少个非空集合即可。
于是根据二项式反演,我们可以得到
S ( n , k ) = 1 k ! i = 1 k ( 1 ) k i ( k i ) i n = i = 0 k ( 1 ) k i ( k i ) ! · i n i !

因为 i 从0开始和从1开始没有什么区别。观察到最后的形式其实是一个卷积,因此我们可以通过NTT在 O ( n l o g n ) 的时间内预处理数第二类斯特林数。
第二类斯特林数的性质还有一个表述,就是
k n = i = 1 n ( k i ) S ( n , i ) i !
也就是将 i k n 。其实也非常好理解,因为若 i > k ( k i ) = 0 n < k i > n S ( n , i ) = 0 ,不会影响计算结果。
利用第二类斯特林数的性质,我们可以处理出自然数幂和。
先证明一个引理:
i = m n ( i m ) = ( n + 1 n m ) b < 0 b > a ( a b ) = 0

显然,当 n = 0 时无论 m 取何非负整数都满足要求,或当 m = 0 n 取任何非负整数也满足要求。接下来证明若 n , m n , m + 1 n + 1 , m + 1
i = m + 1 n + 1 ( i m + 1 ) = i = m n ( i m + 1 ) + ( i m ) = ( n + 1 n m ) + ( n + 1 n m 1 ) = ( n + 2 ( n + 1 ) ( m + 1 ) )

引理得证,接下来开始计算自然数幂和。
i = 1 n i k = i = 1 n j = 1 m i n ( i , k ) ( i j ) S ( k , j ) j ! = j = 1 k S ( k , j ) j ! i = j n ( i j ) = j = 1 k S ( k , j ) j ! ( n + 1 n j ) = j = 1 k S ( k , j ) ( n + 1 ) j + 1 _ j + 1

由于 ( n + 1 ) j + 1 _ 是由 j + 1 个连续整数相乘,必然有一个为 j + 1 的倍数。因此这种方法可以在 O ( k 2 ) 的时间内处理出任何模数下的自然数幂和。如果模数类似于998244353,我们可以先用NTT预处理出所有的第二类斯特林数,再预处理出 n + 1 的下降幂和正整数逆元,可以在 O ( k l o g k ) 的时间计算出自然数幂和。

性质应用例题BZOJ2159

给定一棵树,每条边边权为1,对于每个节点 u i = 1 n d i s t ( u , i ) k
考虑应用第二类斯特林数的性质

i = 1 n d i s t ( u , i ) k = i = 1 n j = 1 k S ( k , j ) ( d i s t ( u , i ) j ) j ! = j = 1 k S ( k , j ) j ! i = 1 n ( d i s t ( u , i ) j )

则对于每个节点,都计算出 i = 1 n ( d i s t ( u , i ) j ) 即可。我们分两次进行树形dp,第一次统计每个节点和它子树当中所有点的和,记为 f ( u , j ) f ( u , j ) = v s o n [ u ] f ( v , j 1 ) + f ( v , j ) ,第二次统计每个节点除子树外的所有节点的和,记为 g ( u , j ) g ( u , j ) = g ( f a [ u ] , j ) + g ( f a [ u ] , j 1 ) + v s o n [ f a [ u ] ] v u f ( v , j 2 ) + 2 f ( v , j 1 ) + f ( v , j ) ,后面那个求和预处理一下 s ( j ) = v s o n [ f a [ u ] ] f ( v , j ) ,计算的时候减去自己即可。总复杂度 O ( n k + k 2 )

反演公式


g ( n ) = i = m n S ( n , i ) f ( i )


f ( n ) = i = m n ( 1 ) n i s ( n , i ) g ( i )

其中大写 S 表示第二类斯特林数,小写 s 表示第一类斯特林数。
证明:
i = m n ( 1 ) n i s ( n , i ) g ( i )

= i = m n ( 1 ) n i s ( n , i ) j = m i S ( i , j ) f ( j )

= j = m n f ( j ) i = j n ( 1 ) n i s ( n , i ) S ( i , j )

考虑两类斯特林数的性质,有
x n _ = i = 1 n ( 1 ) n i s ( n , i ) x i = i = 1 n ( 1 ) n i s ( n , i ) j = 1 i S ( i , j ) x j _

= j = 1 n x j _ i = j n ( 1 ) n i s ( n , i ) S ( i , j )

根据上述等式,我们发现只有当 j = n 时后面算式的值才应当为1,其他时刻全为0.因此:
i = m n ( 1 ) n i s ( n , i ) g ( i ) = f ( n )

证毕。
我们其实会发现斯特林反演和二项式反演的形式很像,那二项式反演的第二种形式斯特林反演是否满足呢?满足。
g ( m ) = i = m n S ( i , m ) f ( i ) f ( m ) = i = m n ( 1 ) i m s ( i , m ) g ( i )

用类似二项式反演的办法可以得到
i = m n ( 1 ) i m s ( i , m ) g ( i ) = j = m n f ( j ) i = m j ( 1 ) i m S ( j , i ) s ( i , m )

再次考虑他们的性质,换一种方法可以得到:
x n = i = 1 n S ( n , i ) x i _ = i = 1 n S ( n , i ) j = 1 i ( 1 ) i j s ( i , j ) x j

= j = 1 n x j i = j n ( 1 ) i j S ( n , i ) s ( i , j )

仍然会有后面的部分为1当且仅当 j = n 。于是把这个性质带入回去,也就是把上式的 j 变为 m n 变为 j ,就会发现只有当 j = m 的时候上式的值才为1.因此
j = m n f ( j ) i = m j ( 1 ) i m S ( 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 2 x 。为什么呢?对于任何一个自由元的子集,它们异或出来的结果必然也可以用主元代替,这就对应了一个全0串的情况。

于是我们用 O ( b e l l ( n ) n 2 s ) 的时间算出了所有的 g ,接下来算出 f 即可。

根据定义,有

g ( m ) = i = m n S ( i , m ) f ( i )
因为计算的时候我们相当于把 i 个连通块划分成了 m 个子集。
于是根据斯特林反演,我们可以得到
f ( m ) = i = m n ( 1 ) i m s ( i , m ) g ( i )

于是我们最终可以求出 f ( 1 ) ,整个问题便解决了。

猜你喜欢

转载自blog.csdn.net/WAautomaton/article/details/81407148