本文要求读者熟练掌握组合数学
二项式反演
-
二项式反演原理:
∑ n i = 0 ( n i ) ( − 1 ) n − i = ∑ n i = 0 ( n i ) ( − 1 ) i = [ n = 0 ] \underset{i=0}{\overset{n}\sum}\begin{pmatrix}n\\ i\end{pmatrix}(-1)^{n-i}=\underset{i=0}{\overset{n}\sum}\begin{pmatrix}n\\ i\end{pmatrix}(-1)^{i}=[n=0] i=0∑n(ni)(−1)n−i=i=0∑n(ni)(−1)i=[n=0] -
二项式反演:
f ( n ) = ∑ n i = m ( n i ) g ( i ) ⇔ g ( n ) = ∑ n i = m ( n i ) ( − 1 ) n − i f ( i ) f(n)=\underset{i=m}{\overset{n}\sum}\begin{pmatrix}n\\ i\end{pmatrix}g(i)\Leftrightarrow g(n)=\underset{i=m}{\overset{n}\sum}\begin{pmatrix}n\\ i\end{pmatrix}(-1)^{n-i}f(i) f(n)=i=m∑n(ni)g(i)⇔g(n)=i=m∑n(ni)(−1)n−if(i)
f ( n ) = ∑ m i = n ( i n ) g ( i ) ⇔ g ( n ) = ∑ m i = n ( i n ) ( − 1 ) i − n f ( i ) f(n)=\underset{i=n}{\overset{m}\sum}\begin{pmatrix}i\\ n\end{pmatrix}g(i)\Leftrightarrow g(n)=\underset{i=n}{\overset{m}\sum}\begin{pmatrix}i\\ n\end{pmatrix}(-1)^{i-n}f(i) f(n)=i=n∑m(in)g(i)⇔g(n)=i=n∑m(in)(−1)i−nf(i)
二项式反演与容斥原理一样具有容斥意义、对符号容斥和修正三种形式。
容斥意义处理部分情况比较简单,但是难以处理另一些问题。
二项式反演的几种形式
g ( x ) g(x) g(x)表示始终表示恰好有 x x x个元素满足限制的方案数
恰好->至多
-
f
(
x
)
f(x)
f(x)表示至多有
x
x
x个元素满足限制的方案数
如果一种方案有 y ≤ x y\leq x y≤x个元素满足限制,那么我们认为它只贡献一次。 -
f
(
x
)
f(x)
f(x)表示选出
x
x
x个元素可能满足限制的方案数(有人把这个也称为至多)
对于一个实际上有 y ≤ x y\leq x y≤x个元素满足限制的方案数,我们认为它贡献了 ( n − y x − y ) \begin{pmatrix}n-y\\x-y\end{pmatrix} (n−yx−y)次
恰好->至少
-
f ( x ) f(x) f(x)表示至少有 x x x个元素满足限制的方案数
对于一种方案有 y ≥ x y\geq x y≥x个元素满足限制,我们认为它只贡献一次 -
f ( x ) f(x) f(x)表示选出 x x x个元素一定满足限制的方案数,或指定 x x x个元素满足限制的方案数。(有人把这个也称为至少)
对于实际上有 y ≥ x y\geq x y≥x个元素满足限制的方案,我们认为它贡献了 ( y x ) \begin{pmatrix}y\\x\end{pmatrix} (yx)次。
注意只要文中不提到“选出”,本文中我们就不认为我们会重复统计同一种状态。(但是许多人喜欢混用这两种说法)
具体使用哪种状态设计,主要看哪种状态中的 f f f更易于求解。
一般来说:
如果“至少/至多”有一个可以设计状态,那么另一个也可以。
如果“选出一定/选出可能”有一个可以设计状态,那么另一个也可以。
对于同时出现的两种状态设计方案,在设计状态的时候要对限制取补集。
如果一个题目既可以使用“至少/至多”,又可以使用“选出”的方法设计状态,那么通常说明对于每个元素的限制是相等的,那么要求出 = 0 =0 =0或 = m =m =m的方案数,就可以使用容斥意义。
两种限制互补的设法本质相同。
一些限制更加自由的题目经常会有更多种类的状态设计方案。
错位排列
对于长度为 n n n的错位排列数 D n D_n Dn,可以用二项式反演的方法求出。
容斥意义
有两个比较明显的限制:
- 序列长度 = n =n =n
- 序列错排数 = n =n =n
显然对2容斥
首先可以从容斥意义的角度思考:设
S
i
S_i
Si表示第
i
i
i个位置排错的方案数,则
D
n
=
∣
⋂
n
i
=
1
S
i
∣
=
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
∣
⋂
i
∈
T
S
i
‾
∣
D_n=\left| {\underset{i=1}{\overset{n}\bigcap}}S_i\right|={\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|
Dn=
i=1⋂nSi
=T⊆[n]∑(−1)∣T∣
i∈T⋂Si
T
T
T的意义是指定一些位置排对,然后另一些位置随意的方案数,可以发现
∣
⋂
i
∈
T
S
i
‾
∣
=
(
n
−
∣
T
∣
)
!
\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|=(n-|T|)!
i∈T⋂Si
=(n−∣T∣)!,也就是说那固定的
∣
T
∣
|T|
∣T∣个位置不动,剩下位置任意填。
这样求解的复杂度为
O
(
2
n
)
O(2^n)
O(2n),我们考虑优化,我们发现补集的交的大小只与相交集合的数量有关,因此就会有:
∣
⋂
i
∈
T
S
i
‾
∣
=
f
(
∣
T
∣
)
=
(
n
−
∣
T
∣
)
!
\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|=f(|T|)=(n-|T|)!
i∈T⋂Si
=f(∣T∣)=(n−∣T∣)!
D
n
=
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
f
(
∣
T
∣
)
D_n={\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}f(|T|)
Dn=T⊆[n]∑(−1)∣T∣f(∣T∣)
然后我们考虑对于大小相同的集合批量计算,大小为
∣
T
∣
|T|
∣T∣的集合共有
(
n
∣
T
∣
)
\begin{pmatrix}n\\|T|\end{pmatrix}
(n∣T∣)个,每一个的贡献为
(
−
1
)
∣
T
∣
f
(
∣
T
∣
)
(-1)^{|T|}f(|T|)
(−1)∣T∣f(∣T∣)得到:
D
n
=
∑
n
i
=
0
(
n
i
)
(
−
1
)
i
f
(
i
)
D_n=\underset{i=0}{\overset n\sum}\begin{pmatrix}n\\i\end{pmatrix}(-1)^if(i)
Dn=i=0∑n(ni)(−1)if(i)
=
∑
n
i
=
0
(
n
i
)
(
−
1
)
i
(
n
−
i
)
!
=\underset{i=0}{\overset n\sum}\begin{pmatrix}n\\i\end{pmatrix}(-1)^i(n-i)!
=i=0∑n(ni)(−1)i(n−i)!
时间复杂度优化为 O ( n ) O(n) O(n)
至多
设
f
(
x
)
=
x
!
f(x)=x!
f(x)=x!表示长度为
n
n
n的序列至多前
x
x
x个数排错的方案数,
g
(
x
)
g(x)
g(x)表示长度为
n
n
n的序列恰好前
x
x
x个数排错的方案数。
(恰好前
x
x
x个数排错,意思就是前
x
x
x个数全部排错)
那么就会有
f
(
x
)
=
∑
x
i
=
0
(
x
i
)
g
(
i
)
f(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}g(i)
f(x)=i=0∑x(xi)g(i)
组合意义是,我们可以认为
g
(
x
)
g(x)
g(x)对应的后面
n
−
x
n-x
n−x的位置都是一样的,因此我们可以认为
g
(
x
)
g(x)
g(x)表示长度为
x
x
x的错位排列数,即
D
x
D_x
Dx。我们枚举长度为
n
n
n的序列,在前
x
x
x个数中有
i
i
i个排错了,那么这
i
i
i个数排错的方案共有
g
(
i
)
g(i)
g(i)种。
因而有:
g
(
x
)
=
∑
x
i
=
0
(
x
i
)
(
−
1
)
x
−
i
f
(
i
)
=
∑
x
i
=
0
(
−
1
)
x
−
i
x
!
(
x
−
i
)
!
=
∑
x
i
=
0
(
−
1
)
i
x
!
i
!
g(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}(-1)^{x-i}f(i)=\underset{i=0}{\overset x\sum}(-1)^{x-i}\frac {x!}{(x-i)!}=\underset{i=0}{\overset x\sum}(-1)^{i}\frac {x!}{i!}
g(x)=i=0∑x(xi)(−1)x−if(i)=i=0∑x(−1)x−i(x−i)!x!=i=0∑x(−1)ii!x!
至少
在这道题目里面,“至多”的状态设计方案是最自然的,但是按照剧本,也存在“至少”的状态设计方案。
按照套路应该对限制取补集:
设
f
(
x
)
f(x)
f(x)表示长度为
n
n
n的序列至少后
n
−
x
n-x
n−x个数排对的方案数,则
f
(
x
)
=
x
!
f(x)=x!
f(x)=x!。
g
g
g的维持定义不变即可。
我们枚举长度为
n
n
n的序列前
x
x
x中有
i
i
i个数排错,则:
f
(
x
)
=
∑
x
i
=
0
(
x
i
)
g
(
i
)
f(x)=\underset{i=0}{\overset {x} \sum}\begin{pmatrix}x\\i\end{pmatrix}g(i)
f(x)=i=0∑x(xi)g(i)
同样可以得到 g g g
选出一定
在本题当中,根据 x ! x! x!,表示这 x x x个位置不限制的方案数,我们可以知道:
- 限制一些位置随意,另一些位置排对是容易的
- 限制一些位置随意,另一些位置排错是困难的
例如假设我们设 f ( x ) f(x) f(x)表示长度为 n n n的序列,其中 x x x个位置排错,剩余位置不管,则 f ( x ) = ( n x ) D x ⋅ ( n − x ) ! f(x)=\begin{pmatrix}n\\x\end{pmatrix}D_x\cdot (n-x)! f(x)=(nx)Dx⋅(n−x)!,看起来求解 f f f和求解 D D D完全就是一回事,显然不太行
我们可以设
f
(
x
)
=
(
n
x
)
(
n
−
x
)
!
f(x)=\begin{pmatrix}n\\x\end{pmatrix}(n-x)!
f(x)=(nx)(n−x)!表示长度为
n
n
n的序列,选出
x
x
x个位置一定排对的方案数。
设
g
(
x
)
=
(
n
x
)
D
n
−
x
g(x)=\begin{pmatrix}n\\x\end{pmatrix}D_{n-x}
g(x)=(nx)Dn−x表示长度为
x
x
x的序列,恰好
x
x
x个位置排对的方案数。
注意这里 f , g f,g f,g指的都是任选 n n n个位置中 x x x个位置排对的方案数,而不是前 x x x个。
我们考虑一个实际上有 y y y个数排对的方案数,会被 f ( x ) f(x) f(x)算到的次数,实际上是 ( y x ) \begin{pmatrix}y\\x\end{pmatrix} (yx)次。因为只有恰好选到 y y y个排对的数的一个大小为 x x x的子集时才在右侧 ( n − x ) ! (n-x)! (n−x)!贡献一次。 ( n − x ) ! (n-x)! (n−x)!表示所有情况,因此我们研究的这种情况每次都会被贡献恰好一次。
那么就会有:
f
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑n(ix)g(i)
因此:
g
(
x
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
f
(
i
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
(
n
i
)
(
n
−
i
)
!
g(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}f(i)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}\begin{pmatrix}n\\i\end{pmatrix}(n-i)!
g(x)=i=x∑n(ix)(−1)i−xf(i)=i=x∑n(ix)(−1)i−x(ni)(n−i)!
=
∑
n
i
=
x
(
n
i
)
(
i
x
)
(
−
1
)
i
−
x
(
n
−
i
)
!
=\underset{i=x}{\overset n\sum}\begin{pmatrix}n\\i\end{pmatrix}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}(n-i)!
=i=x∑n(ni)(ix)(−1)i−x(n−i)!
=
∑
n
i
=
x
(
n
x
)
(
n
−
x
i
−
x
)
(
−
1
)
i
−
x
(
n
−
i
)
!
=\underset{i=x}{\overset n\sum}\begin{pmatrix}n\\x\end{pmatrix}\begin{pmatrix}n-x\\i-x\end{pmatrix}(-1)^{i-x}(n-i)!
=i=x∑n(nx)(n−xi−x)(−1)i−x(n−i)!
=
(
n
x
)
∑
n
i
=
x
(
n
−
x
i
−
x
)
(
−
1
)
i
−
x
(
n
−
i
)
!
=\begin{pmatrix}n\\x\end{pmatrix}\underset{i=x}{\overset n\sum}\begin{pmatrix}n-x\\i-x\end{pmatrix}(-1)^{i-x}(n-i)!
=(nx)i=x∑n(n−xi−x)(−1)i−x(n−i)!
=
(
n
x
)
∑
n
−
x
i
=
0
(
n
−
x
i
)
(
−
1
)
i
(
n
−
x
−
i
)
!
=\begin{pmatrix}n\\x\end{pmatrix}\underset{i=0}{\overset {n-x}\sum}\begin{pmatrix}n-x\\i\end{pmatrix}(-1)^{i}(n-x-i)!
=(nx)i=0∑n−x(n−xi)(−1)i(n−x−i)!
=
(
n
x
)
∑
n
−
x
i
=
0
(
n
−
x
n
−
x
−
i
)
(
−
1
)
n
−
x
−
i
i
!
=\begin{pmatrix}n\\x\end{pmatrix}\underset{i=0}{\overset {n-x}\sum}\begin{pmatrix}n-x\\n-x-i\end{pmatrix}(-1)^{n-x-i}i!
=(nx)i=0∑n−x(n−xn−x−i)(−1)n−x−ii!
=
(
n
x
)
∑
n
−
x
i
=
0
(
n
−
x
i
)
(
−
1
)
n
−
x
−
i
i
!
=\begin{pmatrix}n\\x\end{pmatrix}\underset{i=0}{\overset {n-x}\sum}\begin{pmatrix}n-x\\i\end{pmatrix}(-1)^{n-x-i}i!
=(nx)i=0∑n−x(n−xi)(−1)n−x−ii!
=
(
n
x
)
∑
n
−
x
i
=
0
(
n
−
x
)
!
(
n
−
x
−
i
)
!
(
−
1
)
n
−
x
−
i
=\begin{pmatrix}n\\x\end{pmatrix}\underset{i=0}{\overset {n-x}\sum}\frac {(n-x)!}{(n-x-i)!}(-1)^{n-x-i}
=(nx)i=0∑n−x(n−x−i)!(n−x)!(−1)n−x−i
我们发现恰好有:
g
x
=
(
n
x
)
D
n
−
x
g_x=\begin{pmatrix}n\\x\end{pmatrix}D_{n-x}
gx=(nx)Dn−x
这符合我们的预期。
选出可能
按照套路对状态设计取补集:
设
f
(
x
)
f(x)
f(x)表示长度为
n
n
n的序列,选出
x
x
x个位置可能排错的方案数。
则
f
(
x
)
=
(
n
x
)
x
!
f(x)=\begin{pmatrix}n\\x\end{pmatrix}x!
f(x)=(nx)x!
设
g
(
x
)
=
(
n
x
)
D
x
g(x)=\begin{pmatrix}n\\x\end{pmatrix}D_x
g(x)=(nx)Dx表示长度为
n
n
n的序列,恰好
x
x
x个位置排错的方案数。
我们考虑一种事实上有
y
y
y个位置排错的一个方案,会在
f
(
x
)
f(x)
f(x)中贡献
(
n
−
y
x
−
y
)
\begin{pmatrix}n-y\\x-y\end{pmatrix}
(n−yx−y)次。
因为我们必须先要求
x
x
x个位置中的
y
y
y个取到我们那种方案中的
y
y
y个位置,剩下的
x
−
y
x-y
x−y个元素在剩下的
n
−
y
n-y
n−y个位置中随意选取。
那我们枚举事实上有
i
i
i个位置排错,就得到:
f
(
x
)
=
∑
x
i
=
0
(
n
−
i
x
−
i
)
g
(
i
)
f(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}n-i\\x-i\end{pmatrix}g(i)
f(x)=i=0∑x(n−ix−i)g(i)
=
∑
x
i
=
0
(
n
−
i
n
−
x
)
g
(
i
)
=\underset{i=0}{\overset x\sum}\begin{pmatrix}n-i\\n-x\end{pmatrix}g(i)
=i=0∑x(n−in−x)g(i)
=
∑
n
i
=
n
−
x
(
i
n
−
x
)
g
(
n
−
i
)
=\underset{i=n-x}{\overset n\sum}\begin{pmatrix}i\\n-x\end{pmatrix}g(n-i)
=i=n−x∑n(in−x)g(n−i)
设
f
′
(
x
)
=
f
(
n
−
x
)
=
(
n
n
−
x
)
(
n
−
x
)
!
f'(x)=f(n-x)=\begin{pmatrix}n\\n-x\end{pmatrix}(n-x)!
f′(x)=f(n−x)=(nn−x)(n−x)!,
g
′
(
x
)
=
g
(
n
−
x
)
=
(
n
n
−
x
)
D
n
−
x
g'(x)=g(n-x)=\begin{pmatrix}n\\n-x\end{pmatrix}D_{n-x}
g′(x)=g(n−x)=(nn−x)Dn−x,得到:
f
′
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
′
(
i
)
f'(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g'(i)
f′(x)=i=x∑n(ix)g′(i)
则:
g
′
(
x
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
f
′
(
i
)
g'(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}f'(i)
g′(x)=i=x∑n(ix)(−1)i−xf′(i)
与刚才的“选出一定”的式子本质相同。
UVALive 7040
题意简述,有一排
n
n
n个格子,
m
m
m种颜色,涂满颜色,使得相邻格子颜色不同,并且每一种颜色都用到,统计方案数。
(
1
≤
n
≤
1
0
9
,
1
≤
m
≤
1
0
6
1\leq n\leq 10^9,1\leq m\leq 10^6
1≤n≤109,1≤m≤106)
容斥意义
有三个比较明显的限制:
- 长度为 n n n
- m m m种颜色必须用到
- 相邻格子互不相同
由于 n n n太大了,而且容斥了也没啥用,看起来限制1几乎不能容斥。
如果不要求
m
m
m种颜色都用到,则我们发现答案为
m
⋅
(
m
−
1
)
n
−
1
m\cdot (m-1)^{n-1}
m⋅(m−1)n−1,也就是说第一个格子随便选,第二个格子往后不能和之前一个格子重复。如果要求
m
m
m种颜色都用到,那么会非常的烦,可以考虑把限制2容斥掉。
(因为通常情况下,如果没有这个限制好做,并且有了这个限制不好做,那么就可以考虑容斥掉这个限制)
限制3也是不好容斥的。
因此我们考虑容斥掉限制2,如果采用容斥意义的方法,那就是把1、3看做总限制,对2设计集合,即设 S i S_i Si表示用到第 i i i种颜色的所有方案构成的集合,则答案为 ∣ ⋂ m i = 1 S i ∣ = ∑ T ⊆ [ m ] ( − 1 ) ∣ T ∣ ∣ ⋂ i ∈ T S i ‾ ∣ \left| {\underset{i=1}{\overset{m}\bigcap}}S_i\right|={\underset{T\subseteq [m]}{\overset{}\sum}}(-1)^{|T|}\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right| i=1⋂mSi =T⊆[m]∑(−1)∣T∣ i∈T⋂Si
我们考虑如何求解
∣
⋂
i
∈
T
S
i
‾
∣
\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|
i∈T⋂Si
,发现这个东西的意义就是指定
T
T
T以内的颜色不能使用,其他颜色任意的情况数,那么就是
∣
⋂
i
∈
T
S
i
‾
∣
=
f
(
∣
T
∣
)
=
(
m
−
∣
T
∣
)
⋅
(
m
−
1
−
∣
T
∣
)
n
−
1
\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|=f(|T|)=(m-|T|)\cdot (m-1-|T|)^{n-1}
i∈T⋂Si
=f(∣T∣)=(m−∣T∣)⋅(m−1−∣T∣)n−1,因此最后的式子就变成了:
∑
T
⊆
[
m
]
(
−
1
)
∣
T
∣
f
(
∣
T
∣
)
{\underset{T\subseteq [m]}{\overset{}\sum}}(-1)^{|T|}f(|T|)
T⊆[m]∑(−1)∣T∣f(∣T∣)
这样的话复杂度为 O ( 2 m ) O(2^m) O(2m),不能通过。
我们发现
f
(
∣
T
∣
)
f(|T|)
f(∣T∣)只与
T
T
T的大小有关,与
T
T
T本身无关,因此我们可以考虑对于大小相同的
∣
T
∣
|T|
∣T∣批量计算,我们知道
[
m
]
[m]
[m]大小为
i
i
i的子集共有
(
m
i
)
\begin{pmatrix}m\\i\end{pmatrix}
(mi)个,一个子集的贡献为
(
−
1
)
i
f
(
i
)
(-1)^if(i)
(−1)if(i),因此:
∑
T
⊆
[
m
]
(
−
1
)
∣
T
∣
f
(
∣
T
∣
)
=
∑
m
i
=
0
(
m
i
)
(
−
1
)
i
f
(
i
)
{\underset{T\subseteq [m]}{\overset{}\sum}}(-1)^{|T|}f(|T|)=\underset{i=0}{\overset m\sum}\begin{pmatrix}m\\i\end{pmatrix}(-1)^if(i)
T⊆[m]∑(−1)∣T∣f(∣T∣)=i=0∑m(mi)(−1)if(i)
这样可以做到 O ( m log n ) O(m\log n) O(mlogn),带 log \log log是因为快速幂。
至多
设 f ( x ) = x ( x − 1 ) n − 1 f(x)=x(x-1)^{n-1} f(x)=x(x−1)n−1表示至多选择了前 x x x种颜色的方案数,表明第一个位置有 x x x种选择,其他位置有 x − 1 x-1 x−1种选择。
设 g ( x ) g(x) g(x)表示恰好选择了前 x x x种颜色的方案数。
则:
f
(
x
)
=
∑
x
i
=
0
(
x
i
)
g
(
i
)
f(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}g(i)
f(x)=i=0∑x(xi)g(i)
g ( x ) = ∑ x i = 0 ( x i ) ( − 1 ) x − i f ( i ) g(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}(-1)^{x-i}f(i) g(x)=i=0∑x(xi)(−1)x−if(i)
至少
设 f ( x ) f(x) f(x)表示至少没有使用后 m − x m-x m−x种颜色的方案数。
则:
f
(
x
)
=
∑
x
i
=
0
(
x
i
)
g
(
i
)
f(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}g(i)
f(x)=i=0∑x(xi)g(i)
g ( x ) = ∑ x i = 0 ( x i ) ( − 1 ) x − i f ( i ) g(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}(-1)^{x-i}f(i) g(x)=i=0∑x(xi)(−1)x−if(i)
选出一定
我们知道限制颜色一定使用是困难的,但是限制颜色一定不使用是容易的。
设 f ( x ) = ( m x ) ( m − x ) ( m − x − 1 ) n − 1 f(x)=\begin{pmatrix}m\\x\end{pmatrix}(m-x)(m-x-1)^{n-1} f(x)=(mx)(m−x)(m−x−1)n−1表示选出 m m m种颜色中的 x x x种一定不使用的方案数。
设 g ( x ) g(x) g(x)表示选出 m m m种颜色中的 x x x种恰好不使用的方案数。
一种恰好没有用 y y y种颜色的方案会在 f ( x ) f(x) f(x)中贡献 ( y x ) \begin{pmatrix}y\\x\end{pmatrix} (yx)次,因为大小为 y y y的集合的大小为 x x x的子集共有 ( y x ) \begin{pmatrix}y\\x\end{pmatrix} (yx)个,此时如果选出这样一个子集,剩下的部分是 ( m − x ) ( m − x − 1 ) n − 1 (m-x)(m-x-1)^{n-1} (m−x)(m−x−1)n−1,表示所有情况,此时我们讨论的方案会被贡献到恰好一次。
则:
f
(
x
)
=
∑
m
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset m\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑m(ix)g(i)
因此:
g
(
x
)
=
∑
m
i
=
x
(
i
x
)
(
−
1
)
i
−
x
f
(
i
)
g(x)=\underset{i=x}{\overset m\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}f(i)
g(x)=i=x∑m(ix)(−1)i−xf(i)
选出可能
设 f ( x ) = ( m x ) x ( x − 1 ) n − 1 f(x)=\begin{pmatrix}m\\x\end{pmatrix}x(x-1)^{n-1} f(x)=(mx)x(x−1)n−1表示选出 m m m种颜色中的 x x x种可能使用的方案数, g ( x ) g(x) g(x)表示恰好使用了 m m m种颜色中的 x x x的方案数。
假设一种方案恰好使用了 y y y种颜色,则这种方案在 f ( x ) f(x) f(x)中贡献了 ( m − y x − y ) \begin{pmatrix}m-y\\x-y\end{pmatrix} (m−yx−y)次。这是因为首先 x x x种颜色中必须要有这 y y y种颜色,剩下的 x − y x-y x−y种颜色随意在 m − y m-y m−y种颜色中选择,此时我们这种情况会被恰好统计一次,因为 x ( x − 1 ) n − 1 x(x-1)^{n-1} x(x−1)n−1表示剩下的所有情况都贡献一次。
因此:
f
(
x
)
=
∑
x
i
=
0
(
m
−
i
x
−
i
)
g
(
i
)
=
∑
x
i
=
0
(
m
−
i
m
−
x
)
g
(
i
)
f(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}m-i\\x-i\end{pmatrix}g(i)=\underset{i=0}{\overset x\sum}\begin{pmatrix}m-i\\m-x\end{pmatrix}g(i)
f(x)=i=0∑x(m−ix−i)g(i)=i=0∑x(m−im−x)g(i)
设
f
′
(
x
)
=
f
(
m
−
x
)
=
(
m
m
−
x
)
(
m
−
x
)
(
m
−
x
−
1
)
n
−
1
,
g
′
(
x
)
=
g
(
m
−
x
)
f'(x)=f(m-x)=\begin{pmatrix}m\\m-x\end{pmatrix}(m-x)(m-x-1)^{n-1},g'(x)=g(m-x)
f′(x)=f(m−x)=(mm−x)(m−x)(m−x−1)n−1,g′(x)=g(m−x),则:
f
′
(
x
)
=
∑
m
−
x
i
=
0
(
m
−
i
x
)
g
(
i
)
=
∑
x
i
=
0
(
i
x
)
g
′
(
i
)
f'(x)=\underset{i=0}{\overset {m-x}\sum}\begin{pmatrix}m-i\\x\end{pmatrix}g(i)=\underset{i=0}{\overset {x}\sum}\begin{pmatrix}i\\x\end{pmatrix}g'(i)
f′(x)=i=0∑m−x(m−ix)g(i)=i=0∑x(ix)g′(i)
所以我们会发现至少/至多的做法本质相同,选出一定/选出可能的做法本质相同,而选出一定的做法比选出可能的做法要简洁很多,所以可以直接使用选出一定的状态设计方案。
一般能够至多/至少时,我们都较少选择(有的时候不能选择)选出的状态设计方案,因为至多/至少状态设计更多地利用到了子结构性质,这可能会使得问题简化。
P5505
主要有以下几个限制:
- 有 n n n个同学
- 有 m m m个特产
- 每个同学至少分到一个特产
很明显限制3就长得很“容斥”,因为没有它就很好做,有了它就很难做。
容斥意义
集合为
S
i
S_i
Si表示满足第
i
i
i个同学分到至少一个特产的方案的集合,那么答案为
∣
⋂
S
i
∣
\left|\bigcap S_i\right|
∣⋂Si∣,求解补集相当于指定一些同学一个特产都没有。假设集合
T
T
T中的人啥都没有,剩下的部分不管,然后对于特产
j
j
j来说,我们相当于把它划分到
n
−
∣
T
∣
n-|T|
n−∣T∣个人那里,方案数为
(
a
j
+
n
−
∣
T
∣
−
1
n
−
∣
T
∣
−
1
)
\begin{pmatrix}a_j+n-|T|-1\\ n-|T|-1\end{pmatrix}
(aj+n−∣T∣−1n−∣T∣−1),因为所有特产的分配是独立的,所以总方案数是一个乘法原理:
∏
m
j
=
1
(
a
j
+
n
−
∣
T
∣
−
1
n
−
∣
T
∣
−
1
)
\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-|T|-1\\ n-|T|-1\end{pmatrix}
j=1∏m(aj+n−∣T∣−1n−∣T∣−1),因此答案就是:
∣
⋂
n
i
=
1
S
i
∣
=
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
∣
⋂
i
∈
T
S
i
‾
∣
=
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
∏
m
j
=
1
(
a
j
+
n
−
∣
T
∣
−
1
n
−
∣
T
∣
−
1
)
\left| {\underset{i=1}{\overset{n}\bigcap}}S_i\right|={\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}\left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|={\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-|T|-1\\ n-|T|-1\end{pmatrix}
i=1⋂nSi
=T⊆[n]∑(−1)∣T∣
i∈T⋂Si
=T⊆[n]∑(−1)∣T∣j=1∏m(aj+n−∣T∣−1n−∣T∣−1)
直接容斥复杂度为 O ( 2 1000 ) O(2^{1000}) O(21000),不能通过。
我们观察到补集的交集的大小只与相交集合的数量有关,即:
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
∏
m
j
=
1
(
a
j
+
n
−
∣
T
∣
−
1
n
−
∣
T
∣
−
1
)
=
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
f
(
∣
T
∣
)
{\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-|T|-1\\ n-|T|-1\end{pmatrix}={\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}f(|T|)
T⊆[n]∑(−1)∣T∣j=1∏m(aj+n−∣T∣−1n−∣T∣−1)=T⊆[n]∑(−1)∣T∣f(∣T∣)
f
(
∣
T
∣
)
=
∏
m
j
=
1
(
a
j
+
n
−
∣
T
∣
−
1
n
−
∣
T
∣
−
1
)
f(|T|)=\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-|T|-1\\ n-|T|-1\end{pmatrix}
f(∣T∣)=j=1∏m(aj+n−∣T∣−1n−∣T∣−1)
因此我们可以把
f
f
f预处理出来,然后对于相同大小的
T
T
T批量处理,我们会发现大小为
n
n
n的集合的大小为
i
i
i的子集有
(
n
i
)
\begin{pmatrix}n\\i\end{pmatrix}
(ni)个,因为
n
n
n个数任选
i
i
i个就会是一个子集,它们的贡献为
(
−
1
)
i
f
(
i
)
(-1)^if(i)
(−1)if(i)即:
∑
T
⊆
[
n
]
(
−
1
)
∣
T
∣
f
(
∣
T
∣
)
=
∑
n
i
=
0
(
n
i
)
(
−
1
)
i
f
(
i
)
{\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}f(|T|)=\underset{i=0}{\overset n\sum}\begin{pmatrix}n\\i\end{pmatrix}(-1)^if(i)
T⊆[n]∑(−1)∣T∣f(∣T∣)=i=0∑n(ni)(−1)if(i)
这样复杂度就优化到了 O ( n ) O(n) O(n),可以通过。
对符号容斥
我们的限制是每个同学有的特产数量 > 0 >0 >0,很明显可以容斥为 ≤ 0 \leq 0 ≤0,即 = 0 =0 =0
那我们设 f ( i ) = ( n i ) ∏ m j = 1 ( a j + n − i − 1 n − i − 1 ) f(i)=\begin{pmatrix}n\\i\end{pmatrix}\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-i-1\\ n-i-1\end{pmatrix} f(i)=(ni)j=1∏m(aj+n−i−1n−i−1),表示选出 i i i个人没有特产的方案数,设 g ( i ) g(i) g(i)表示恰好 m m m中的 i i i个人没有特产的方案数。
那么:
f
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑n(ix)g(i)
那么:
g
(
x
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
f
(
i
)
g(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}f(i)
g(x)=i=x∑n(ix)(−1)i−xf(i)
则: a n s = g ( 0 ) ans=g(0) ans=g(0)
我们还可以设 f ( i ) = ∏ m j = 1 ( a j + i − 1 i − 1 ) f(i)=\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+i-1\\ i-1\end{pmatrix} f(i)=j=1∏m(aj+i−1i−1)表示至多前 i i i个人有特产的方案数,设 g ( i ) g(i) g(i)表示恰好前 i i i个人有特产(剩下的人没有特产)的方案数,则:
f ( x ) = ∑ x i = 0 ( x i ) g ( i ) f(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}g(i) f(x)=i=0∑x(xi)g(i)
则:
g
(
x
)
=
∑
x
i
=
0
(
x
i
)
(
−
1
)
x
−
i
f
(
i
)
g(x)=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}(-1)^{x-i}f(i)
g(x)=i=0∑x(xi)(−1)x−if(i)
修正
很多较难的题目都可以使用修正法。
如果我们遍出一个式子: ∏ m j = 1 ( a j + n − 1 n − 1 ) \underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-1\\ n-1\end{pmatrix} j=1∏m(aj+n−1n−1),然后我们考虑这个式子算错了什么。它有可能会算上有人没有特产的情况。假如说有一个人没有特产,那么方案数为 ∏ m j = 1 ( a j + n − 2 n − 2 ) \underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-2\\ n-2\end{pmatrix} j=1∏m(aj+n−2n−2),这个人有可能有 ( n 1 ) \begin{pmatrix}n\\1\end{pmatrix} (n1)个,还有两个人没有特产的情况…
因此我们可以写出 f ( i ) f(i) f(i)表示至多前 i i i个人有特产的情况。然后做反演。
或者还有另一种考虑方法:
我们设 f ( i ) = ( n i ) ∏ m j = 1 ( a j + n − i − 1 n − i − 1 ) f(i)=\begin{pmatrix}n\\i\end{pmatrix}\underset{j=1}{\overset{m}\prod}\begin{pmatrix}a_j+n-i-1\\ n-i-1\end{pmatrix} f(i)=(ni)j=1∏m(aj+n−i−1n−i−1),表示选出 i i i个人没有特产的方案数。
我们假设容斥系数为
h
i
h_i
hi,即,我们希望得到:
a
n
s
=
∑
n
i
=
0
f
(
i
)
h
i
ans=\underset{i=0}{\overset n\sum}f(i)h_i
ans=i=0∑nf(i)hi
我们讨论一种方案,它在贡献函数里对应一个
1
1
1,所以一种方案对答案的总贡献为
贡献系数
×
容斥系数
贡献系数\times 容斥系数
贡献系数×容斥系数,其中
贡献系数
=
1
贡献系数=1
贡献系数=1,因此它对于答案的贡献就是容斥系数。然后我们考虑一个事实上有
x
x
x个人没有特产的方案,他会在
f
(
i
)
f(i)
f(i)中被统计到
(
x
i
)
\begin{pmatrix}x\\i\end{pmatrix}
(xi)次,并且会乘上
h
i
h_i
hi,因此它会对
a
n
s
ans
ans贡献的总系数为:
∑
x
i
=
0
(
x
i
)
h
(
i
)
\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}h(i)
i=0∑x(xi)h(i)
我们希望它等于
[
x
=
0
]
[x=0]
[x=0],即:
∑
x
i
=
0
(
x
i
)
h
i
=
[
x
=
0
]
\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}h_i=[x=0]
i=0∑x(xi)hi=[x=0]
根据二项式反演原理
∑
n
i
=
0
(
n
i
)
(
−
1
)
i
=
[
n
=
0
]
\underset{i=0}{\overset{n}\sum}\begin{pmatrix}n\\ i\end{pmatrix}(-1)^{i}=[n=0]
i=0∑n(ni)(−1)i=[n=0],我们发现:
h
i
=
(
−
1
)
i
h_i=(-1)^i
hi=(−1)i
或者当我们写出来了 ∑ x i = 0 ( x i ) h i = [ x = 0 ] \underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix}h_i=[x=0] i=0∑x(xi)hi=[x=0]之后,我们可以直接对这个式子做二项式反演,把 h i h_i hi反转出来,就得到:
h x = ∑ x i = 0 ( x i ) ( − 1 ) x − i [ i = 0 ] = ( − 1 ) x h_x=\underset{i=0}{\overset x\sum}\begin{pmatrix}x\\i\end{pmatrix} (-1)^{x-i}[i=0]=(-1)^x hx=i=0∑x(xi)(−1)x−i[i=0]=(−1)x
同类题目
给出 n n n个数, b 1 , b 2 , b 3 . . . b n b_1,b_2,b_3...b_n b1,b2,b3...bn,构造 n n n个数, a 1 , a 2 . . . a n ( a i > 1 ) a_1,a_2...a_n(a_i>1) a1,a2...an(ai>1),使得 a 1 ⋅ a 2 ⋅ a 3 . . . a n = b 1 ⋅ b 2 . . . B n a_1\cdot a_2\cdot a_3...a_n=b_1\cdot b_2...B_n a1⋅a2⋅a3...an=b1⋅b2...Bn;
问一共有多少种数列满足上述条件。
相当于质因子集合上的分特产。
HDU6397
有
n
n
n个格子,要求填数,每个数的范围是
[
1
,
m
]
[1,m]
[1,m],要求最终的和是
K
K
K。
n
,
m
,
K
=
1
0
5
n,m,K=10^5
n,m,K=105
题目有三个限制:
- n n n个格子
- 数的范围是 [ 1 , m ] [1,m] [1,m]
- 和是 K K K(换句话说数的范围有一个上界是 [ 1 , K ] [1,K] [1,K])
很明显对 2 2 2容斥,数的范围 ≤ m \leq m ≤m不好做,可以容斥为 > m >m >m,则:
f
(
x
)
=
(
n
x
)
(
K
−
1
−
(
m
+
1
)
⋅
x
n
−
1
)
f(x)=\begin{pmatrix}n\\x\end{pmatrix}\begin{pmatrix}K-1-(m+1)\cdot x\\n-1\end{pmatrix}
f(x)=(nx)(K−1−(m+1)⋅xn−1),表示选出
x
x
x个数
>
m
>m
>m,所有的数总和为
K
K
K的方案数。
注意非法的组合数看做
0
0
0
那么设 g ( x ) g(x) g(x)表示恰好有 x x x个数 > m >m >m,总和为 K K K的方案数。
那么:
f
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑n(ix)g(i)
可以反演得到 g g g
这个题还可以选出可能,例如设 f ( x ) f(x) f(x)表示选出 x x x个数可能 ≤ m \leq m ≤m,所有的数总和为 K K K的方案数。
同类题目
一共
n
n
n场比赛,赢了
m
m
m场,连续赢的场数
≤
k
\leq k
≤k,问有多少种可能。
可以看作是在
n
−
m
+
1
n-m+1
n−m+1个格子内填入一些
[
0
,
k
]
[0,k]
[0,k]之间的数,使得和为
m
m
m。
如果要求连续赢的数量恰好为 k k k,那么答案为 a n s ( k ) − a n s ( k − 1 ) ans(k)-ans(k-1) ans(k)−ans(k−1),因为这里只需要减去所有不含有 k k k的即可,所以并不需要二项式反演。
BZOJ2839
题意简述:
一个有
n
n
n个不同元素的集合有
2
n
2^n
2n个不同子集,现在其子集中取出至少一个集合,使得其交集的元素个数恰好为
k
k
k,求合法方案数。
(
1
≤
n
≤
1
0
6
,
0
≤
k
≤
n
1\leq n\leq 10^6,0\leq k\leq n
1≤n≤106,0≤k≤n)
刚才那些都是可以容斥意义的,称为容斥原理也可以,称为二项式反演也可以。但是下面就到了不能容斥意义(据我所知),只能二项式反演的部分了。
我们研究一下限制,其实这题只有交集大小 = k =k =k这一个限制,所以我们直接对它容斥。
显然我们能比较容易的限制一些集合的交集必须为什么,所以可以容斥为 ≥ k \geq k ≥k。
设
f
(
x
)
=
(
n
x
)
(
2
2
n
−
x
−
1
)
f(x)=\begin{pmatrix}n\\x\end{pmatrix}\left(2^{2^{n-x}}-1\right)
f(x)=(nx)(22n−x−1),表示选出交集大小为
x
x
x的若干集合的方案数(指定它们有一个大小为
x
x
x的交集,是否还有其他交集不管。)
即指定
i
i
i个交集元素,则包含这
i
i
i个的集合有
2
n
−
i
2^{n-i}
2n−i个,每个集合可选可不选,但不能都不选,由此可得此方案数。
如果考虑一个实际上有
i
i
i个交集的方案,会在
f
(
x
)
f(x)
f(x)被计算几次,显然会被计算
(
i
x
)
\begin{pmatrix}i\\x\end{pmatrix}
(ix)次。
如果这里看不懂可以回去看看错位排列和涂色的相应解释。
那么设
g
(
i
)
g(i)
g(i)表示实际上有
i
i
i个交集的方案数,则:
f
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑n(ix)g(i)
就会有:
g
(
x
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
x
−
i
f
(
i
)
g(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{x-i}f(i)
g(x)=i=x∑n(ix)(−1)x−if(i)
P4921
容易想到容斥,指定匹配是好做的,因此我们把匹配数容斥为 ≥ k \geq k ≥k。
设
f
(
x
)
=
(
n
x
)
n
x
‾
⋅
2
x
⋅
(
2
n
−
2
x
)
!
f(x)=\begin{pmatrix}n\\x\end{pmatrix}n^{\underline x}\cdot 2^{x}\cdot (2n-2x)!
f(x)=(nx)nx⋅2x⋅(2n−2x)!表示选出
x
x
x个匹配是合法的方案数。
那么
g
(
x
)
g(x)
g(x)表示恰好有
x
x
x组合法匹配的方案数。
因而有:
f
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑n(ix)g(i)
则:
g
(
x
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
f
(
i
)
g(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}f(i)
g(x)=i=x∑n(ix)(−1)i−xf(i)
P4859
我们称两个数组为 a , b a,b a,b,设 K = n + k 2 K=\frac {n+k}2 K=2n+k,则题目有两个限制:
对关系容斥:
- 相当于对 a , b a,b a,b的双射计数,可以用子集反演把双射容斥为子集,时间复杂度为 O ( 2 2000 ) O\left(2^{2000}\right) O(22000),显然不行。
- 题目要求 = K =K =K,可以容斥为 ≤ K \leq K ≤K或 ≥ K \geq K ≥K,这里选择容斥为 ≥ K \geq K ≥K。
设 f ( x ) f(x) f(x)表示选出 x x x个合法匹配的方案数, g ( x ) g(x) g(x)表示恰好 x x x个合法匹配的方案数,那么我们只需要求解 f f f即可。
f ( x ) f(x) f(x)可以dp出来。
设 f i , j f_{i,j} fi,j表示考虑了 a a a的前 i i i个元素的匹配情况,目前有 j j j个合法匹配的方案数。
如果我们要创造一个合法匹配:那么 f i , j + = ( k − ( j − 1 ) ) ⋅ f i − 1 , j − 1 f_{i,j}+=(k-(j-1))\cdot f_{i-1,j-1} fi,j+=(k−(j−1))⋅fi−1,j−1,其中 k k k表示序列 b b b中有多少个数能与 a i a_i ai构成合法匹配。
否则我们要创造一个非法匹配,但是想想就会发现这有后效性,考虑消除后效性。我们可以使用推迟的办法,即令这个元素暂不匹配: f i , j + = f i − 1 , j f_{i,j}+=f_{i-1,j} fi,j+=fi−1,j
最后 f ( x ) = f n , i ⋅ ( n − i ) ! f(x)=f_{n,i}\cdot (n-i)! f(x)=fn,i⋅(n−i)!,表示我们选出 i i i个合法匹配,剩下的位置随意匹配的方案数。
SP9097
题目分析:
首先我们序列的各个元素的出现次数是确定的,假设序列构成的多重集为 S S S。( ∣ S ∣ = n |S|=n ∣S∣=n)
明显有一个 O ( 2 n n ) O(2^n n) O(2nn)的容斥做法。
我们直接枚举哪些位置不合法,这样我们相当于指定了这些位置的元素,也就相当于 S S S少了一些元素,剩下的集合即 S − T S-T S−T。那么其他位置可以随意安防,即 S − T S-T S−T的多重集排列数。
那么多重集排列数就是 ( n − ∣ T ∣ ) ! ∏ c o u n t i ( S − T ) ! \frac{(n-|T|)!}{\prod count_i(S-T)!} ∏counti(S−T)!(n−∣T∣)!,其中 c o u n t i ( S ) count_i(S) counti(S)表示 S S S中元素 i i i的出现次数。
乘上容斥系数贡献到答案即可。
根据直觉,或者这个式子,我们可以发现其实答案与原序列的各个元素的出现顺序没有关系,只与原序列构成的多重集有关系。
如果要考虑快速的算的话,首先会想到容斥dp,但是这个东西确实不太能在原序列上容斥dp。
为什么不行呢?大概是因为没法在转移的同时记录每一种颜色目前用到过的数量,所以没法乘系数。
但是其实我们完全不需要记录每一种颜色用到过的数量,我们完全同时处理同一种颜色的容斥系数。
对于贡献
(
n
−
∣
T
∣
)
!
∏
c
o
u
n
t
i
(
S
−
T
)
!
\frac{(n-|T|)!}{\prod count_i(S-T)!}
∏counti(S−T)!(n−∣T∣)!,我们只算分母上的部分,对于分子上的东西最后再算。
具体来说设
f
i
,
j
f_{i,j}
fi,j表示考虑了前
i
i
i种颜色所在的所有格子的安排,并指定
j
j
j个非法。
转移就是枚举第
i
i
i种颜色指定了几个非法:
f
i
,
j
=
∑
k
≤
j
f
i
−
1
,
j
−
k
(
c
n
t
i
k
)
1
(
c
n
t
i
−
k
)
!
f_{i,j}=\underset{k\le j}\sum f_{i-1,j-k}\begin{pmatrix}cnt_i\\k\end{pmatrix}\frac{1}{(cnt_i-k)!}
fi,j=k≤j∑fi−1,j−k(cntik)(cnti−k)!1
这个式子大概是说,枚举第
i
i
i种颜色指定了
k
k
k个非法,由于颜色为
i
i
i的格子数量为
c
n
t
i
cnt_i
cnti,所以选出
k
k
k个。它们的贡献都是最后那个分数。
最后我们再把容斥系数和贡献的分母一起算上去:
a
n
s
=
∑
i
(
−
1
)
i
f
n
,
i
(
n
−
i
)
!
ans=\underset{i}{\sum}(-1)^{i}f_{n,i}(n-i)!
ans=i∑(−1)ifn,i(n−i)!
或者还有一种转移方法是直接把容斥系数也乘进方案里面,转移大概就是:
f
i
,
j
=
∑
k
≤
j
(
−
1
)
k
f
i
−
1
,
j
−
k
(
c
n
t
i
k
)
1
(
c
n
t
i
−
k
)
!
f_{i,j}=\underset{k\le j}\sum (-1)^{k}f_{i-1,j-k}\begin{pmatrix}cnt_i\\k\end{pmatrix}\frac{1}{(cnt_i-k)!}
fi,j=k≤j∑(−1)kfi−1,j−k(cntik)(cnti−k)!1
a
n
s
=
∑
i
f
n
,
i
(
n
−
i
)
!
ans=\underset i\sum f_{n,i}(n-i)!
ans=i∑fn,i(n−i)!
不过这就涉及到容斥dp了,这就按下不表了。
也可以从二项式反演的角度理解。
大概是设
f
(
x
)
f(x)
f(x)表示选出
x
x
x个位置排错的方案数,
g
(
x
)
g(x)
g(x)表示恰好
x
x
x个排错的方案数。
a
n
s
=
g
(
0
)
ans=g(0)
ans=g(0)
转移一层的复杂度是 O ( c n t i 2 ) O(cnt_i^2) O(cnti2),由于 ∑ c n t i = n \sum cnt_i=n ∑cnti=n,因此总复杂度是 O ( n 2 ) O(n^2) O(n2)的
接下来是高维二项式反演。
CF1228E
二维限制,处理起来有两种办法:
- 二维反演
- 约束一维满足条件
二维二项式反演
最小值为 1 1 1意味着两个条件:
- 其他所有数字 ≥ 1 \geq 1 ≥1
- 至少有一个数字为 1 1 1
第二个条件看起来非常容斥,我们把至少有一个数字为 1 1 1,容斥为“没有任何一个数字为 1 1 1”
设
f
(
i
,
j
)
f(i,j)
f(i,j)表示选出
i
i
i行没
1
1
1,选出
j
j
j列没
1
1
1的方案数。
则:
f
(
i
,
j
)
=
(
n
i
)
(
n
j
)
(
k
−
1
)
n
⋅
i
+
n
⋅
j
−
i
⋅
j
⋅
k
(
n
−
i
)
(
n
−
j
)
f(i,j)=\begin{pmatrix}n\\i\end{pmatrix}\begin{pmatrix}n\\j\end{pmatrix}(k-1)^{n\cdot i+n\cdot j-i\cdot j}\cdot k^{(n-i)(n-j)}
f(i,j)=(ni)(nj)(k−1)n⋅i+n⋅j−i⋅j⋅k(n−i)(n−j),表示选出
i
i
i行
j
j
j列,这样就会有
n
⋅
i
+
n
⋅
j
−
i
⋅
j
n\cdot i+n\cdot j-i\cdot j
n⋅i+n⋅j−i⋅j个格子有
k
−
1
k-1
k−1个选择,剩下的
(
n
−
i
)
(
n
−
j
)
(n-i)(n-j)
(n−i)(n−j)个格子有
k
k
k种选择。
如果设
g
(
x
,
y
)
g(x,y)
g(x,y)表示恰好
x
x
x行没
1
1
1,恰好
y
y
y列没
1
1
1的方案数。则:
f
(
x
,
y
)
=
∑
n
i
=
x
(
i
x
)
∑
n
j
=
y
(
j
y
)
g
(
i
,
j
)
f(x,y)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}\underset{j=y}{\overset n\sum}\begin{pmatrix}j\\y\end{pmatrix}g(i,j)
f(x,y)=i=x∑n(ix)j=y∑n(jy)g(i,j)
则:
g
(
x
,
y
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
∑
n
j
=
y
(
j
y
)
(
−
1
)
j
−
y
f
(
i
,
j
)
g(x,y)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}\underset{j=y}{\overset n\sum}\begin{pmatrix}j\\y\end{pmatrix}(-1)^{j-y}f(i,j)
g(x,y)=i=x∑n(ix)(−1)i−xj=y∑n(jy)(−1)j−yf(i,j)
时间复杂度 O ( n 2 ) O(n^2) O(n2)
约束一维满足条件
其实我们可以容易的限制一行最小值为
1
1
1。
一行最小值为
1
1
1的方案数为
k
n
−
(
k
−
1
)
n
k^n-(k-1)^n
kn−(k−1)n
n
n
n行最小值均为
1
1
1的方案数为
(
k
n
−
(
k
−
1
)
n
)
n
\left(k^n-(k-1)^n\right)^n
(kn−(k−1)n)n
如果我们选出
x
x
x列没
1
1
1,相当于指定
x
x
x个位置有
k
−
1
k-1
k−1种选择:
(
n
x
)
(
(
k
n
−
x
−
(
k
−
1
)
n
−
x
)
(
k
−
1
)
x
)
n
=
f
(
x
)
\begin{pmatrix}n\\x\end{pmatrix}\left(\left(k^{n-x}-(k-1)^{n-x}\right)(k-1)^{x}\right)^n=f(x)
(nx)((kn−x−(k−1)n−x)(k−1)x)n=f(x)
设 g ( i ) g(i) g(i)表示恰好 i i i列没 1 1 1的方案数。
则:
f
(
x
)
=
∑
n
i
=
x
(
i
x
)
g
(
i
)
f(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}g(i)
f(x)=i=x∑n(ix)g(i)
g ( x ) = ∑ n i = x ( i x ) ( − 1 ) i − x f ( i ) g(x)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}f(i) g(x)=i=x∑n(ix)(−1)i−xf(i)
时间复杂度 O ( n log n ) O(n\log n) O(nlogn)
第一种做法像下面这样推式子也可以做到 O ( n log n ) O(n\log n) O(nlogn)
CF997C
设
f
(
x
,
y
)
f(x,y)
f(x,y)表示选出
x
x
x行相同,选出
y
y
y列相同的方案数,则:
如果设
g
(
x
,
y
)
g(x,y)
g(x,y)表示恰好
x
x
x行相同,
y
y
y列相同的方案数,则:
f
(
x
,
y
)
=
∑
n
i
=
x
(
i
x
)
∑
n
j
=
y
(
j
y
)
g
(
i
,
j
)
f(x,y)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}\underset{j=y}{\overset{n}\sum}\begin{pmatrix}j\\y\end{pmatrix}g(i,j)
f(x,y)=i=x∑n(ix)j=y∑n(jy)g(i,j)
即:
g
(
x
,
y
)
=
∑
n
i
=
x
(
i
x
)
(
−
1
)
i
−
x
∑
n
j
=
y
(
j
y
)
(
−
1
)
j
−
y
f
(
i
,
j
)
g(x,y)=\underset{i=x}{\overset n\sum}\begin{pmatrix}i\\x\end{pmatrix}(-1)^{i-x}\underset{j=y}{\overset{n}\sum}\begin{pmatrix}j\\y\end{pmatrix}(-1)^{j-y}f(i,j)
g(x,y)=i=x∑n(ix)(−1)i−xj=y∑n(jy)(−1)j−yf(i,j)
那么 a n s = g ( 0 , 0 ) = ∑ n i = 0 ( − 1 ) i ∑ n j = 0 ( − 1 ) j f ( i , j ) ans=g(0,0)=\underset{i=0}{\overset n\sum}(-1)^{i}\underset{j=0}{\overset{n}\sum}(-1)^{j}f(i,j) ans=g(0,0)=i=0∑n(−1)ij=0∑n(−1)jf(i,j)
首先把
i
=
0
i=0
i=0或
j
=
0
j=0
j=0的情况贡献到
g
(
0
,
0
)
g(0,0)
g(0,0)上,然后现在讨论
i
≥
1
,
j
≥
1
i\geq 1,j\geq 1
i≥1,j≥1的情况:
a
n
s
+
=
∑
n
i
=
1
(
−
1
)
i
∑
n
j
=
1
(
−
1
)
j
f
(
i
,
j
)
ans+=\underset{i=1}{\overset n\sum}(-1)^{i}\underset{j=1}{\overset{n}\sum}(-1)^{j}f(i,j)
ans+=i=1∑n(−1)ij=1∑n(−1)jf(i,j)
+
=
∑
n
i
=
1
(
−
1
)
i
∑
n
j
=
1
(
−
1
)
j
3
(
n
i
)
(
n
j
)
3
(
n
−
i
)
(
n
−
j
)
+=\underset{i=1}{\overset n\sum}(-1)^{i}\underset{j=1}{\overset{n}\sum}(-1)^{j}3\begin{pmatrix}n\\i\end{pmatrix}\begin{pmatrix}n\\j\end{pmatrix}3^{(n-i)(n-j)}
+=i=1∑n(−1)ij=1∑n(−1)j3(ni)(nj)3(n−i)(n−j)
+
=
∑
n
i
=
1
(
−
1
)
i
∑
n
j
=
1
(
−
1
)
j
3
(
n
i
)
(
n
j
)
3
n
2
⋅
(
3
−
n
)
i
⋅
(
3
−
n
)
j
⋅
(
3
i
)
j
+=\underset{i=1}{\overset n\sum}(-1)^{i}\underset{j=1}{\overset{n}\sum}(-1)^{j}3\begin{pmatrix}n\\i\end{pmatrix}\begin{pmatrix}n\\j\end{pmatrix}3^{n^2}\cdot {\left(3^{-n}\right)}^i\cdot {\left(3^{-n}\right)}^j\cdot {\left(3^i\right)}^j
+=i=1∑n(−1)ij=1∑n(−1)j3(ni)(nj)3n2⋅(3−n)i⋅(3−n)j⋅(3i)j
+
=
3
n
2
+
1
∑
n
i
=
1
(
−
1
)
i
(
n
i
)
⋅
(
3
−
n
)
i
∑
n
j
=
1
(
n
j
)
⋅
(
−
3
i
−
n
)
j
+=3^{n^2+1}\underset{i=1}{\overset n\sum}(-1)^{i}\begin{pmatrix}n\\i\end{pmatrix}\cdot {\left(3^{-n}\right)}^i\underset{j=1}{\overset{n}\sum}\begin{pmatrix}n\\j\end{pmatrix}\cdot {\left(-3^{i-n}\right)}^j
+=3n2+1i=1∑n(−1)i(ni)⋅(3−n)ij=1∑n(nj)⋅(−3i−n)j
这样就把最后面搞成了二项式定理的形式:
+
=
3
n
2
+
1
∑
n
i
=
1
(
−
1
)
i
(
n
i
)
⋅
(
3
−
n
)
i
⋅
(
(
−
3
i
−
n
+
1
)
n
−
1
)
+=3^{n^2+1}\underset{i=1}{\overset n\sum}(-1)^{i}\begin{pmatrix}n\\i\end{pmatrix}\cdot {\left(3^{-n}\right)}^i\cdot \left(\left(-3^{i-n}+1\right)^n-1\right)
+=3n2+1i=1∑n(−1)i(ni)⋅(3−n)i⋅((−3i−n+1)n−1)
a n s = ∣ U ∣ − g ( 0 , 0 ) ans=|U|-g(0,0) ans=∣U∣−g(0,0)
因为行列之间的限制是取并集,并不是取交,直接约束一维满足条件比较难。但是通过容斥并为交然后再强行约束也不是不行
练习题
后记
于是皆大欢喜。