二项式反演

本文要求读者熟练掌握组合数学

二项式反演

  • 二项式反演原理:
    ∑ 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=0n(ni)(1)ni=i=0n(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=mn(ni)g(i)g(n)=i=mn(ni)(1)nif(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=nm(in)g(i)g(n)=i=nm(in)(1)inf(i)

二项式反演与容斥原理一样具有容斥意义、对符号容斥和修正三种形式。
容斥意义处理部分情况比较简单,但是难以处理另一些问题。

二项式反演的几种形式

g ( x ) g(x) g(x)表示始终表示恰好有 x x x个元素满足限制的方案数

恰好->至多

  1. f ( x ) f(x) f(x)表示至多有 x x x个元素满足限制的方案数
    如果一种方案有 y ≤ x y\leq x yx个元素满足限制,那么我们认为它只贡献一次。
  2. f ( x ) f(x) f(x)表示选出 x x x个元素可能满足限制的方案数(有人把这个也称为至多)
    对于一个实际上有 y ≤ x y\leq x yx个元素满足限制的方案数,我们认为它贡献了 ( n − y x − y ) \begin{pmatrix}n-y\\x-y\end{pmatrix} (nyxy)

恰好->至少

  1. f ( x ) f(x) f(x)表示至少有 x x x个元素满足限制的方案数
    对于一种方案有 y ≥ x y\geq x yx个元素满足限制,我们认为它只贡献一次

  2. f ( x ) f(x) f(x)表示选出 x x x个元素一定满足限制的方案数,或指定 x x x个元素满足限制的方案数。(有人把这个也称为至少)
    对于实际上有 y ≥ x y\geq x yx个元素满足限制的方案,我们认为它贡献了 ( 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,可以用二项式反演的方法求出。

容斥意义

有两个比较明显的限制:

  1. 序列长度 = n =n =n
  2. 序列错排数 = 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=1nSi =T[n](1)T iTSi
T T T的意义是指定一些位置排对,然后另一些位置随意的方案数,可以发现 ∣ ⋂ i ∈ T S i ‾ ∣ = ( n − ∣ T ∣ ) ! \left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right|=(n-|T|)! iTSi =(nT)!,也就是说那固定的 ∣ 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|)! iTSi =f(T)=(nT)!
D n = ∑ T ⊆ [ n ] ( − 1 ) ∣ T ∣ f ( ∣ T ∣ ) D_n={\underset{T\subseteq [n]}{\overset{}\sum}}(-1)^{|T|}f(|T|) Dn=T[n](1)Tf(T)

然后我们考虑对于大小相同的集合批量计算,大小为 ∣ T ∣ |T| T的集合共有 ( n ∣ T ∣ ) \begin{pmatrix}n\\|T|\end{pmatrix} (nT)个,每一个的贡献为 ( − 1 ) ∣ T ∣ f ( ∣ T ∣ ) (-1)^{|T|}f(|T|) (1)Tf(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=0n(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=0n(ni)(1)i(ni)!

时间复杂度优化为 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=0x(xi)g(i)
组合意义是,我们可以认为 g ( x ) g(x) g(x)对应的后面 n − x n-x nx的位置都是一样的,因此我们可以认为 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=0x(xi)(1)xif(i)=i=0x(1)xi(xi)!x!=i=0x(1)ii!x!

至少

在这道题目里面,“至多”的状态设计方案是最自然的,但是按照剧本,也存在“至少”的状态设计方案。

按照套路应该对限制取补集:
f ( x ) f(x) f(x)表示长度为 n n n的序列至少后 n − x n-x nx个数排对的方案数,则 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=0x(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(nx)!,看起来求解 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)(nx)!表示长度为 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)Dnx表示长度为 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)! (nx)!贡献一次。 ( n − x ) ! (n-x)! (nx)!表示所有情况,因此我们研究的这种情况每次都会被贡献恰好一次。

那么就会有:
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=xn(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=xn(ix)(1)ixf(i)=i=xn(ix)(1)ix(ni)(ni)!
= ∑ 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=xn(ni)(ix)(1)ix(ni)!
= ∑ 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=xn(nx)(nxix)(1)ix(ni)!
= ( 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=xn(nxix)(1)ix(ni)!
= ( 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=0nx(nxi)(1)i(nxi)!
= ( 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=0nx(nxnxi)(1)nxii!
= ( 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=0nx(nxi)(1)nxii!
= ( 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=0nx(nxi)!(nx)!(1)nxi

我们发现恰好有:
g x = ( n x ) D n − x g_x=\begin{pmatrix}n\\x\end{pmatrix}D_{n-x} gx=(nx)Dnx

这符合我们的预期。

选出可能

按照套路对状态设计取补集:
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} (nyxy)次。
因为我们必须先要求 x x x个位置中的 y y y个取到我们那种方案中的 y y y个位置,剩下的 x − y x-y xy个元素在剩下的 n − y n-y ny个位置中随意选取。

那我们枚举事实上有 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=0x(nixi)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=0x(ninx)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=nxn(inx)g(ni)

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(nx)=(nnx)(nx)! 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(nx)=(nnx)Dnx,得到:
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=xn(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=xn(ix)(1)ixf(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 1n109,1m106

容斥意义

有三个比较明显的限制:

  1. 长度为 n n n
  2. m m m种颜色必须用到
  3. 相邻格子互不相同

由于 n n n太大了,而且容斥了也没啥用,看起来限制1几乎不能容斥。

如果不要求 m m m种颜色都用到,则我们发现答案为 m ⋅ ( m − 1 ) n − 1 m\cdot (m-1)^{n-1} m(m1)n1,也就是说第一个格子随便选,第二个格子往后不能和之前一个格子重复。如果要求 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=1mSi =T[m](1)T iTSi

我们考虑如何求解 ∣ ⋂ i ∈ T S i ‾ ∣ \left|{\underset{i\in T}{\bigcap}\overline{S_i}}\right| iTSi ,发现这个东西的意义就是指定 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} iTSi =f(T)=(mT)(m1T)n1,因此最后的式子就变成了:
∑ T ⊆ [ m ] ( − 1 ) ∣ T ∣ f ( ∣ T ∣ ) {\underset{T\subseteq [m]}{\overset{}\sum}}(-1)^{|T|}f(|T|) T[m](1)Tf(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)Tf(T)=i=0m(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(x1)n1表示至多选择了前 x x x种颜色的方案数,表明第一个位置有 x x x种选择,其他位置有 x − 1 x-1 x1种选择。

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=0x(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=0x(xi)(1)xif(i)

至少

f ( x ) f(x) f(x)表示至少没有使用后 m − x m-x mx种颜色的方案数。

则:
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=0x(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=0x(xi)(1)xif(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)(mx)(mx1)n1表示选出 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} (mx)(mx1)n1,表示所有情况,此时我们讨论的方案会被贡献到恰好一次。

则:
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=xm(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=xm(ix)(1)ixf(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(x1)n1表示选出 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} (myxy)次。这是因为首先 x x x种颜色中必须要有这 y y y种颜色,剩下的 x − y x-y xy种颜色随意在 m − y m-y my种颜色中选择,此时我们这种情况会被恰好统计一次,因为 x ( x − 1 ) n − 1 x(x-1)^{n-1} x(x1)n1表示剩下的所有情况都贡献一次。

因此:
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=0x(mixi)g(i)=i=0x(mimx)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(mx)=(mmx)(mx)(mx1)n1,g(x)=g(mx),则:
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=0mx(mix)g(i)=i=0x(ix)g(i)

所以我们会发现至少/至多的做法本质相同,选出一定/选出可能的做法本质相同,而选出一定的做法比选出可能的做法要简洁很多,所以可以直接使用选出一定的状态设计方案。
一般能够至多/至少时,我们都较少选择(有的时候不能选择)选出的状态设计方案,因为至多/至少状态设计更多地利用到了子结构性质,这可能会使得问题简化。

P5505

主要有以下几个限制:

  1. n n n个同学
  2. m m m个特产
  3. 每个同学至少分到一个特产

很明显限制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| nT个人那里,方案数为 ( a j + n − ∣ T ∣ − 1 n − ∣ T ∣ − 1 ) \begin{pmatrix}a_j+n-|T|-1\\ n-|T|-1\end{pmatrix} (aj+nT1nT1),因为所有特产的分配是独立的,所以总方案数是一个乘法原理: ∏ 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=1m(aj+nT1nT1),因此答案就是:
∣ ⋂ 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=1nSi =T[n](1)T iTSi =T[n](1)Tj=1m(aj+nT1nT1)

直接容斥复杂度为 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)Tj=1m(aj+nT1nT1)=T[n](1)Tf(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=1m(aj+nT1nT1)

因此我们可以把 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)Tf(T)=i=0n(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=1m(aj+ni1ni1),表示选出 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=xn(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=xn(ix)(1)ixf(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=1m(aj+i1i1)表示至多前 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=0x(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=0x(xi)(1)xif(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=1m(aj+n1n1),然后我们考虑这个式子算错了什么。它有可能会算上有人没有特产的情况。假如说有一个人没有特产,那么方案数为 ∏ 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=1m(aj+n2n2),这个人有可能有 ( 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=1m(aj+ni1ni1),表示选出 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=0nf(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=0x(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=0x(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=0n(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=0x(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=0x(xi)(1)xi[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 a1a2a3...an=b1b2...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

题目有三个限制:

  1. n n n个格子
  2. 数的范围是 [ 1 , m ] [1,m] [1,m]
  3. 和是 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)(K1(m+1)xn1),表示选出 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=xn(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 nm+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(k1),因为这里只需要减去所有不含有 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 1n106,0kn

刚才那些都是可以容斥意义的,称为容斥原理也可以,称为二项式反演也可以。但是下面就到了不能容斥意义(据我所知),只能二项式反演的部分了。

我们研究一下限制,其实这题只有交集大小 = 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)(22nx1),表示选出交集大小为 x x x的若干集合的方案数(指定它们有一个大小为 x x x的交集,是否还有其他交集不管。)
即指定 i i i个交集元素,则包含这 i i i个的集合有 2 n − i 2^{n-i} 2ni个,每个集合可选可不选,但不能都不选,由此可得此方案数。

如果考虑一个实际上有 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=xn(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=xn(ix)(1)xif(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)nx2x(2n2x)!表示选出 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=xn(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=xn(ix)(1)ixf(i)

P4859

我们称两个数组为 a , b a,b a,b,设 K = n + k 2 K=\frac {n+k}2 K=2n+k,则题目有两个限制:

对关系容斥:

  1. 相当于对 a , b a,b a,b的双射计数,可以用子集反演把双射容斥为子集,时间复杂度为 O ( 2 2000 ) O\left(2^{2000}\right) O(22000),显然不行。
  2. 题目要求 = 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(j1))fi1,j1,其中 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+=fi1,j

最后 f ( x ) = f n , i ⋅ ( n − i ) ! f(x)=f_{n,i}\cdot (n-i)! f(x)=fn,i(ni)!,表示我们选出 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 ST。那么其他位置可以随意安防,即 S − T S-T ST的多重集排列数。

那么多重集排列数就是 ( n − ∣ T ∣ ) ! ∏ c o u n t i ( S − T ) ! \frac{(n-|T|)!}{\prod count_i(S-T)!} counti(ST)!(nT)!,其中 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(ST)!(nT)!,我们只算分母上的部分,对于分子上的东西最后再算。

具体来说设 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=kjfi1,jk(cntik)(cntik)!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(ni)!

或者还有一种转移方法是直接把容斥系数也乘进方案里面,转移大概就是:
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=kj(1)kfi1,jk(cntik)(cntik)!1
a n s = ∑ i f n , i ( n − i ) ! ans=\underset i\sum f_{n,i}(n-i)! ans=ifn,i(ni)!
不过这就涉及到容斥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. 二维反演
  2. 约束一维满足条件

二维二项式反演

最小值为 1 1 1意味着两个条件:

  1. 其他所有数字 ≥ 1 \geq 1 1
  2. 至少有一个数字为 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)(k1)ni+njijk(ni)(nj),表示选出 i i i j j j列,这样就会有 n ⋅ i + n ⋅ j − i ⋅ j n\cdot i+n\cdot j-i\cdot j ni+njij个格子有 k − 1 k-1 k1个选择,剩下的 ( n − i ) ( n − j ) (n-i)(n-j) (ni)(nj)个格子有 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=xn(ix)j=yn(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=xn(ix)(1)ixj=yn(jy)(1)jyf(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(k1)n
n n n行最小值均为 1 1 1的方案数为 ( k n − ( k − 1 ) n ) n \left(k^n-(k-1)^n\right)^n (kn(k1)n)n
如果我们选出 x x x列没 1 1 1,相当于指定 x x x个位置有 k − 1 k-1 k1种选择: ( 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)((knx(k1)nx)(k1)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=xn(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=xn(ix)(1)ixf(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=xn(ix)j=yn(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=xn(ix)(1)ixj=yn(jy)(1)jyf(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=0n(1)ij=0n(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 i1,j1的情况:
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=1n(1)ij=1n(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=1n(1)ij=1n(1)j3(ni)(nj)3(ni)(nj)
+ = ∑ 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=1n(1)ij=1n(1)j3(ni)(nj)3n2(3n)i(3n)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=1n(1)i(ni)(3n)ij=1n(nj)(3in)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=1n(1)i(ni)(3n)i((3in+1)n1)

a n s = ∣ U ∣ − g ( 0 , 0 ) ans=|U|-g(0,0) ans=Ug(0,0)

因为行列之间的限制是取并集,并不是取交,直接约束一维满足条件比较难。但是通过容斥并为交然后再强行约束也不是不行

练习题

P5339
P5400
P5401

后记

于是皆大欢喜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值