重修 二项式反演

开头

我只知道容斥不知道二项式反演。

反演,顾名思义就是有两个函数 f,g,知道 fg 表示后反过来 gf 表示。

二项式(a+b)n,别学了二项式反演忘了二项式定理

i=0n(ni)aibni=(a+b)n

常见形式

(一)

式子

f(n)=i=0n(1)i(ni)g(i)g(n)=i=0n(1)i(ni)f(i)

证明

i=0n(1)i(ni)f(i)=i=0n(1)i(ni)j=0i(1)j(ij)g(j)=j=0ng(j)(nj)i=jn(1)ij(njij)=j=0ng(j)(nj)[nj=0]=g(n)

(二)

式子

f(n)=i=nN(1)i(in)g(i)g(n)=i=nN(1)i(in)f(i)

证明

i=nN(1)i(in)f(i)=i=nN(1)i(in)j=iN(1)j(ji)g(j)=j=nNg(j)(1)jn(jn)i=nj(1)in(jnin)=j=nNg(j)(1)jn(jn)[jn=0]=g(n)

证明的总结

由于两个式子都是对称的,所以都只证明了充分性。

证明都用到了

(ab)(bc)=(ac)(acbc)

[n=0]=i=0n(ni)(1)i

多元的情况

我们拿二元举例子:

f(n,m)=i=0nj=0m(1)i+j(ni)(mj)g(i,j)g(n,m)=i=0nj=0m(1)i+j(ni)(mj)f(i,j)

其他应该同理。

例题

第二类斯特林数

我不会,长大后再学习。(

错排

g(x) 表示 n 个位置中至多x 个位置放错的方案数,而 f(x) 表示恰好

g(n)=n!g(n)=i=0n(ni)f(i)

反演

f(n)=i=0n(1)ni(ni)g(i)=i=0n(1)ni(ni)i!=i=0n(1)nin!(ni)!=n!i=0n(1)ni(ni)!=n!i=0n(1)ii!

错排通项由此诞生。

由于后面的和式是 e1 的泰勒展开,所以我们得到:

任意一个排列,当 n,该排列为错排的概率为 1e

P.S.

错排递推式 fn=(n1)(fn1+fn2)

n 所在环为二元环,删掉二元环后是错排,(n1)fn2

否则环长至少为三,将 n 前后接起来跳过 n 后是错排,(n1)fn1

P4859 已经没有什么好害怕的了

给定 n2000 长度的序列 a1,,anb1,,bn2n 个元素两两不同,求排列 p1,,pn 的个数使得(以下的 k 为原题的 n+k2):

i=1n[ai>bpi]=k

f(x) 表示恰好 x[ai>bpi]{p} 的方案数,显然答案为 f(k)

g(x) 表示钦定 x 组…………的方案数。

钦定和至少的区别

钦定指固定某些位置满足条件,而至少只是单纯的计数。

举个例子,假设要计数值域 0,1a1,a2,a3,a4 序列中 ai=1 个数不少于 2 个的方案数。

对于 {a}={0,1,1,1} 来说:

至少:贡献为 1,因为就一种状态。

钦定:贡献为 3,因为序列中 31,我们钦定任意 2 个为 1 都会产生贡献,所以贡献为 (32)=3

显然

g(x)=i=xn(ix)f(i)

二项式反演

f(x)=i=xn(1)ix(ix)g(i)Ans=f(k)=i=kn(1)ik(ik)g(i)

问题转化为求 g(k),,g(n)

首先我们可以将 {a},{b} 升序排序,由于值互不相同,所以可求 c1,,cn 使得 bciaibci+1

我们考虑 DP,dp(i,j) 表示 a 的前 i 个中有 j钦定匹配了比她小的 b 值,即有

dp(i,j)=dp(i1,j)+dp(i1,j1)(ci(j1))

然后 g(i)=dp(n,i)(ni)! 就做完了。

时间 O(n2)

record

CF997C Sky Full of Stars

有一个 n×n 的正方形网格,用红绿蓝三种颜色染色,求有多少种染色方案使得至少一行或一列是同一种颜色。

结果对 998244353 取模。

f(i,j) 表示恰好 i 行与 j 列颜色相同,而 g(i,j) 表示钦定 i 行与 j 列颜色相同。

g(x,y)=i=xnj=yn(ix)(jy)f(i,j)

二项式反演

f(x,y)=i=xnj=yn(1)i+jxy(ix)(jy)g(i,j)Ans=3n2f(0,0)=3n2i=0nj=0n(1)i+jg(i,j)

g(i,j) 要分类:

  1. i0,j0,此时钦定的同色行列颜色必然全部一样,即

g(i,j)=(ni)(nj)3(ni)(nj)+1

  1. i0,j=0i=0,j0 情况类似),此时这些行之间颜色可以不同,即

g(i,0)=(ni)3n(ni)+i

  1. i=j=0,此时自由了我向往自由!

g(0,0)=3n2

综上

Ans=2i=1n(1)ig(i,0)i=1nj=1n(1)i+jg(i,j)=2ABA=i=1n(1)i(ni)3n(ni)+iB=i=1nj=1n(1)i+j(ni)(nj)3(ni)(nj)+1

A,B 分开求(分别均使用二项式定理)

A=3n2i=1n(1)i(ni)3ni+i=3n2i=1n(ni)(31n)i=3n2((131n)n1)

B=3n2+1i=1nj=1n(1)i+j(ni)(nj)3ninj+ij=3n2+1i=1n(1)i(ni)3nij=1n(1)j(nj)3(in)j=3n2+1i=1n(1)i(ni)3nij=1n(nj)(3in)j=3n2+1i=1n(1)i(ni)3ni((13in)n1)

所以就 O(nlogn) 解决了。

record

P6076 [JSOI2015]染色问题

n×m 的矩形棋盘,初始无色。现在有 C 种颜料涂,要求:

  1. 棋盘的每一行/列至少有一个小方格被染色。

  2. 每种颜色都在棋盘上出现至少一次。

求染色方案数 mod109+7

一样的套路,我们发现设 f(i,j,k) 表示恰好 i,j 行/列至少有一个染色,k 种颜色被上在墙上的方案数比较困难。

正难则反,设 f(i,j,k) 表示恰好 i,j 行/列完全没有染色k 种颜色没有上在墙上

同理 g(i,j,k)f恰好换成钦定

g(i,j,k)=(ni)(mj)(Ck)(Ck+1)(ni)(mj)

然后求 g 关于 f 的表达式

g(i,j,k)=x=iny=jmz=kC(xi)(yj)(zk)f(x,y,z)

然后三元二项式反演

f(i,j,k)=x=iny=jmz=kC(1)x+y+zijk(xi)(yj)(zk)g(x,y,z)

然而我们要求的最终答案是 f(0,0,0) 即(将 g 一开始的柿子带入)

f(0,0,0)=i=0nj=0mk=0C(1)i+j+kg(i,j,k)=i=0nj=0mk=0C(1)i+j+k(ni)(mj)(Ck)(Ck+1)(ni)(mj)=k=0Ci=0nj=0m(1)i+j+k(ni)(mj)(Ck)(Ck+1)(ni)(mj)

这样我们在第一层循环时预处理后面的幂,时间复杂度 O(nmC)

posted @   ShaoJia  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示