前言
正如标题,想重学一遍计数。
其实也不是完全意义上的重学啦。
重点会放在生成函数、推式子上。
多项式....不想搞诶....可生成函数必须要多项式科技诶...
应该会简单摄入吧...
需要记住的公式
组合数相关
k∑i=0(ni)(mk−i)=(m+nk)
m∑i=0(in)=(m+1n+1)
- 大致证明:从 (0,0) 走到 (n+1,m−n+1) 的方案数 = ∑mi=0从(0,0)走到(n,i−n)的方案数 。
(x+y)α=∑i≥0(αi)xα−iyi=∑i≥0αi–i!xα−iyi
-
将二项式定理扩展到复数域。
-
当前有用的只是推广到负数上,比如这个:
-
1(1−x)n=(1−x)−n=∑i≥0(−n)(−n−1)...(−n−i+1)i!⋅(−x)i=∑i≥0n(n+1)...(n+i−1)i!⋅xi=∑i≥0(n+i−1i)xi
-
现在还有一个了:
-
(1−4x)−12=∑i≥0(2ii)xi
上升/下降幂与普通幂
xn=∑k{nk}xk–– 这是第二类哦
- 拆普通幂的重要公式,用于 n 特别大的情况。
- 可以证明 ∑niik 是关于 n 的 k+1 次多项式。
xn––=∑k[nk](−1)n−kxk 这是第一类哦
上升幂一般用的比较少,所以就不列了。
遇到的其他式子
暂无!
生成函数
感觉网上的一些博客都好奇怪啊...
给你讲一大堆生成函数的一些操作,却不告诉你具体怎么用,而且还要带一堆多项式...
普通型
感觉最适合入门的生成函数题,完美的告诉你生成函数怎么用。
对于第 i 种糖, 都只有一种方法拿走 j 颗这种糖 j≤mi,它的生成函数就是这个样子:fi(x)=1+x+x2,...,xmi
然后 n 种糖方案组合起来就是对应生成函数的卷积,即 F=f1f2...fn 。
所以答案就是 F 第 a∼b 项上的系数之和。(这个可以先转换为 (0∼b)−(0∼a−1))
可现在这样还是不能做。
但是生成函数可以转换成封闭形式(实际上就是转换成了一种好算的形式)
即 fi(x)=1+x+x2,...,xmi=1−xmi+11−x 。
所以 F=∏ni=1(1−xmi+1)(1−x)n 。
现在分子的每一项系数我们可以求了(直接暴力 2n 展开)
可分母是什么鬼呢?
注意上面我们列出的式子:1(1−x)n=∑i≥0(n+i−1i)xi
所以对于分子的一项系数 axb ,对 (0∼k) 的贡献就是 ak−b∑i=0(n+i−1i)=(n+k−bn) 。
这样,除了这题屎一样的模数,就做完了。
2022.2.28 T2
已知 小x 在 (1,A),只向右向下走走到 (B,1),小y 在 (1,1),只向右向上走走到 (B,A)。每一时刻只能让 小x 或 小y 一个人走一步,求 小x、小y 有且仅有在某一时刻在同一坐标上的方案数。
数据范围 A,B≤107 。
先将坐标都同时减一。
设 gi,j 为x和y走到 (i,j) 并相遇的方案数,fi,j 为x和y走到 (i,j) 并第一次相遇的方案数。
则有转移:
gi,j=(2i+Ai,i,A)(Aj)gi,j=i∑k=0fi−k,j(k+kk)
所以我们如果我们设
Fj(x)=∞∑i=0fi,jxiGj(x)=∞∑i=0gi,jxiH(x)=∞∑i=0(2ii)xi
那么就有:
Gj=FjH
根据上面的式子又有 H(x)=1√1−4x 。(王总好像可以用积分、求导爆推%%%)
所以 Fj=Gj⋅H−1=Gj√1−4x 。而
ans=B∑i=0A∑j=0fi,jfB−i,j=a∑i=0[xB]F2i=a∑i=0[xB]G2i(1−4x)=a∑i=0[xB]G20(1−4x)(Ai)2=(2AA)a∑i=0[xB]G20(1−4x)
这样我们可以 O(B) 直接求出 [xB]G20 。
设 fn 表示 n 个点的二叉树个数,gn 表示 n 个点的所有二叉树的叶节点总数。
先考虑 f ,有转移:
fn=n−1∑i=0fi⋅fn−1−i
发现后面就是 F(x)2 的第 n−1 项,所以就有:
F(x)=F(x)2x+1 后面的1表示 f[0]=1
所以可以解出 F(x)=1±√1−4x2x 。
如果我们把 x=0 带入可得 f0 的值,发现 limx→01−√1−4x2x=1,limx→01−√1−4x2x=∞ ,所以 F(x)=1−√1−4x2x 。(其实这就是卡特兰数的生成函数啦)
再考虑 g ,同样先考虑转移:
gn=2n−1∑i=0gi⋅fn−1−i
同样也有 G(x)=2F(x)G(x)+x ,(这里初值为 g0=0,g1=1)
所以可以解出:G(x)=x√1−4x 。
现在就要把 F(x),G(x) 转成可以递推的形式。
对于 g,(1−4x)−12 很熟悉,分子是 x 就表示向右移一位,即 gn=(2n−2n−1) 。
而 f,先要考虑化 (1−4x)12 ,同样用扩展二项式:
(1−4x)12=∑i≥012(12−1)(12−2)...(12−i+1)i!(−4x)i=−∑i≥0(2−1)(3−1)...(2i−2−1)i!(2x)i=−∑i≥02i(2i−2i−1)xi
那么 fn=(2nn)n+1 (因为除了 2x ,向左移了一位,同时上面分子中的 2 就没了)
所以 gnfn 就出来了。
先咕了。
这个用特征方程解 常系数齐次线性递推 的例题。
指数型
其实和普通型查不了多少,或者说普通型的怎么用,那么指数型的就怎么用。
为什么叫指数型,就是如果有一个生成函数 F(x)=∞∑i=1xii! ,那么他的封闭形式就是 F(x)=ex 。
其他的该怎么用就怎么用。
设 bi 为第 i 个数的操作次数,那么这一次操作对答案的贡献为 ∏ai−∏(ai−bi) ,∏ai 是不变的,那么我们就只用考虑 ∏(ai−bi) 的期望,最后再用 ∏ai 减去即可。
所以考虑这样的 {b1,b2,...,bn} 出现的次数,那么就是 (kb1,b2,...,bn)=k!∏bi! ,由此可以设生成函数:
Fj(x)=∞∑i=0(aj−i)xii!=aj∞∑i=0xii!−∞∑i=0ixii!=ajex−∞∑i=0xi(i−1)!=ajex−xex=ex(aj−x)
那么最终的生成函数
F(x)=n∏i=1Fi(x)=n∏i=1ex(ai−x)=enxn∏i=1(ai−x)=∞∑i=0xinii!n∏i=1(ai−x)
后面的 ∏ni=1(ai−x) 是可以暴力转化成 n 次多项式的,那么 [xk]F(x)=∑ni=0binn−i(n−i)! 。
最后就要求 [xk]F(x)n!nk 。
一个比较综合的运用
设 fi 为 i 对情侣坐 2i 椅子并且完全错排的方案数。
那么有 k 对配对的方案数,答案就为 (kn)2fn−k2kk! ,把 k∈[0,n] 的答案全加起来,自然是全部排列的方案数:
n∑i=0(ni)2i!2ifn−i=(2n)!
拆掉 (ni)2 :
n∑i=0(ni)2i!2ifn−i=(2n)!n∑i=0(n!)22ifn−i((n−i)!)2i!=(2n)!n∑i=02ii!⋅fn−i((n−i)!)2=(2n)!n!n!
然后设生成函数:
F(x)=∞∑i=02ixii!=e2xG(x)=∞∑i=0fixii!i!H(x)=∞∑i=0(2n)!xin!n!=(2ii)xi=(1−4x)−12
得 H(x)=F(x)G(x) 。
所以 G(x)=H(x)F(x)=e−2x(1−4x)−12 。
其实你把后面的拆开就会得到由容斥推出来的式子,所以说生成函数真的很无脑。
但是这还不够,你需要求出 fi 的递推式。
这时候我们会给 G(x) 求个导,来进行转化,如:
G′(x)=(−2e−2x(1−4x)−12)+(e−2x−4−2(1−4x)−32)=e−2x(1−4x)−12(−2+21−4x)=e−2x(1−4x)−12(−2+8x+21−4x)=G(x)8x1−4x
所以就有 G′(x)−4xG′(x)=8xG(x) 。
即 [xn]G′(x)−4[xn−1]G′(x)=8[xn−1]G(x) 。
又因为 [xn]G′(x)=(n+1)[xn+1]G(x) 。
所以 (n+1)gn+1−4ngn=8gn−1,gn=fnn!n!
就可以得到递推式:fn+1=4n(n+1)fn+8n2(n+1)fn−1 。
小结
上面的一些题就是基本生成函数的例子,都是没有用多项式科技的好题qwq。
之后会不会入多项式这个坑呢?
不知道,反正先要去搞其他的知识点了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步