多项式x组合数学x线性代数 总结
多项式 \(\times\) 组合数学 \(\times\) 线性代数
这是一篇总结......
Part 1 多项式
OI中的多项式常见的就是推卷积式子和生成函数,一般很少出现直接给式子的题目,与组合数学的联系相对比较紧密
[HEOI2016/TJOI2016] 求和
计算\(f(n)=\sum\limits_{i=0}^n\sum\limits_{j=0}^i \begin{Bmatrix}i\\j\end{Bmatrix} \times 2^j \times j!\),其中\(\begin{Bmatrix}i\\j\end{Bmatrix}\)为第二类斯特林数
考虑到\(i<j\)时\(S(i,j)=0\)
推式子:
\(\sum\limits_{i=0}^n (j-k)^i\)可以预处理计算,里面的东西可以NTT求出,于是便可以\(O(nlogn)\)求出答案
CF755G PolandBall and Many Other Balls
给出一排\(n\)个球,定义一组只可以包括一个球或两个相邻球,一个球只能分到一个组中,求取出\(k\)组的方案数
先考虑一个朴素的DP,记\(f_{i,j}\)表示\(i\)个球放\(j\)组的方案数,于是我们有:
表示可以不选,也可以单独一组,也可以和前一个球共同组成一组
设\(F_i\)表示\(f_i\)的生成函数,于是,我们有:
得到\(F_i-(x+1)F_{i-1}-xF_{i-2}=0\),发现这是个简单的递推,设特征方程:
解得:\(\lambda_1=\frac{(x+1)+\sqrt{x^2+6x+1}}{2}\),\(\lambda_2=\frac{(x+1)-\sqrt{x^2+6x+1}}{2}\),即\(F_i=c_1\lambda_1^i+c_2\lambda_2^i\),代入\(F_0,F_1\)
解得:\(\begin{cases}c_1=\frac{(x+1)+\sqrt{x^2+6x+1}}{2\sqrt{x^2+6x+1}}\\c_2=\frac{-(x+1)+\sqrt{x^2+6x+1}}{2\sqrt{x^2+6x+1}}\end{cases}\)
所以\(F_n=\frac{1}{\sqrt{x^2+6x+1}}(\frac{(x+1)+\sqrt{x^2+6x+1}}{2})^{n+1}+\frac{-(x+1)+\sqrt{x^2+6x+1}}{2\sqrt{x^2+6x+1}}(\frac{(x+1)-\sqrt{x^2+6x+1}}{2})^n\)
发现后面的式子\(\mod x^{n+1}\)等于0,也就是说完全用不上,所以只要算第一个式子
多项式全家桶就行
[CTSC2006]歌唱王国
字符集大小为\(n\),有一个长为\(m\)的字符串\(S\),在空串\(T\)后随机加一个字符,当\(S\)是\(T\)的连续字串后停止,问\(T\)的期望长度
给出概率生成函数PGF的定义,如果对于某个离散型随机变量\(x\),存在\(\{a_n\}\)满足\(P(x=i)=a_i\),记\(\{a_n\}\)的概率生成函数为\(F_i=\sum\limits\limits_{i=0}^{+\infty}a_ix^i\)
概率生成函数有以下性质:
-
\(F(1)=\sum\limits_{i=0}^{+\infty}a_i=1\)
-
\(E(x)=\sum\limits_{i=0}^{+\infty}ia_i=\sum\limits_{i=0}^{+\infty}[x_i]F(1)'\)
-
\[\begin{array} _D(x) &=E[(x-E(x))^2] \\ &=E(x^2)-E(x)^2 \\ &=\sum\limits_{i=0}^{+\infty}[i(i-1)+i]a_i-[\sum\limits_{i=0}^{+\infty}[x_i]F(x)']^2 \\ &=\sum\limits_{i=0}^{+\infty}[x^i][F(x)''+F(x)'-(F(x)')^2 \end{array} \]
设长度为\(i\)时结束的概率为\(f_i\),未结束的概率为\(g_i\)
我们可以得出以下两个式子:
第一个表示\(i-1\)时未结束的概率是\(i\)时结束/未结束的概率之和
第二个表示\(i\)时未结束,在\(T\)后面加一个名字,其中有可能在加第\(j\)个字符时就结束了,而此时加的\(j\)个字符一定满足\(S[1 \cdots j]=S[n-j+1 \cdots n]\),也就是说\(S\)的前\(j\)个字符是\(S\)的一个border
记\(f\)的生成函数为\(F\),\(g\)的生成函数为\(G\)
所以:
我们要求的就是\(E(x)=\sum\limits_{i=0}^{+\infty}[x_i]F(1)'\)
对第一个式子求导,把\(x=1\)代入,得
又有\(F(1)=1\),故可以累加得到答案
Part 2 组合数学
注意一些常见套路和一些式子的组合意义,一些常用的组合恒等式需要能熟练应用
[FJOI2016]建筑师
有\(n\)个建筑,高分别为\(1\)~\(n\),给出从左右看分别能看到的建筑个数\(A,B\),求方案数
肯定,高为\(n\)的建筑一定会被看见,考虑其它\(n-1\)个建筑会被分成\(A+B-2\)个部分,每一部分中最高的建筑的位置已经确定了,于是每一个部分就相当于一个起始段固定的圆排列,再考虑哪些部分放左边,答案就为\(\dbinom{A+B-2}{A-1}\begin{bmatrix}n-1\\A+B-2\end{bmatrix}\)
[CTSC2017] 吉夫特
给定一个长为\(n\)的序列\(a_1,\cdots,a_n\),问有多少个长度大于等于2的不上升子序列\(b_i\)满足
看到组合数和\(\mod 2\),卢卡斯公式便是一个十分自然且优秀的想法
实质上就是把\(n\)和\(m\)二进制分解
考虑到\(\dbinom{1}{0}=1\),\(\dbinom{1}{1}=1\),\(\dbinom{0}{0}=1\),\(\dbinom{0}{1}=0\)
上式大于0当且仅当\(n\)某一二进制位为0时\(m\)也为\(0\),即\(m\)是\(n\)的子集
于是记\(f_i\)表示以\(i\)结尾的满足条件的子序列的方案数,枚举子集转移即可
[PKUWC2018] 随机游走
给出一颗\(n\)个结点的树,从\(x\)出发,每次等概率选择相邻的一条边走去,给出\(m\)次询问,给出一个集合\(S\),求\(S\)中所有点至少经过一次的期望步数
至少经过一次很不好求,考虑用Min-Max容斥转换成第一次经过
记\(f_{u,s}\)表示当前在\(u\),第一次经过\(s\)中的点的期望步数,有:
暴力解需要高斯消元,复杂度显然难以接受,考虑到这是一棵树,尝试分离儿子和父亲的贡献,把\(f_i,s\)写成关于\(f_{fa,s}\)的函数
设\(f_{i,s}=A_if_{fa,s}+B_i\),重写方程:
移项整理得:
这样便可一次树形DP求出\(f_{x,s}\)
记\(F_{x,s}\)为从\(x\)出发,至少经过\(s\)一次的期望步数,则
不需要每次询问都计算一次,可以用FWT预处理子集和优化
Part 3 线性代数
线性代数在OI中有很多应用,从广为人知的矩阵快速幂,线性基,高斯消元,到Matrix-Tree定理,到LGV引理
LGV引理
在一个有向无环图中,边有边权,出发点\(A:\{a_1,\cdots,a_n\}\),目标点\(B:\{b_1,\cdots,b_n\}\),\(a\)到\(b\)的一条路径记作\(P:a \rightarrow b\),记\(w(u,v)=\sum\limits_{P:a \rightarrow b}\prod\limits_{e \in P}w_e\)
记\(G=\begin{pmatrix}w(a_1,b_1)&\cdots&w(a_1,b_n)\\\vdots&\ddots&\vdots\\w(a_n,b_1)&\cdots&w(a_n,b_n)\end{pmatrix}\),有:\(|G|=\sum\limits_{(P_1,\cdots,P_n):A \rightarrow B} sign(\sigma(P))\prod\limits_{i=1}^n\prod\limits_{e \in P_i} w_e\)
即\(|G|\)是所有\(A\)到\(B\)的不相交路径\(P:(P_1,\cdots,P_n)\)的带符号和
倘若把边权设为1,得到的就是不相交路径的方案数
[模板]LGV引理
给出一个\(n \times n\)的棋盘,只能向上或向右走,给出\(m\)个起点和终点,分别为\((a_i,1),\cdots,(a_m,1)\)和\((b_1,n),\cdots,(b_m,n)\),求不相交路径方案数
容易看出从\((a,1)\)走到\((b,n)\)的方案数为\(\dbinom{b-a+n-1}{n-1}\),构造矩阵求出行列式即可
Unknown
给出一个图,每个边有黑白两种颜色,求恰好有\(k\)条白边的生成树个数
我们把白边的边权看作\(x\),黑边的边权看作\(1\),这样,方案数就是一个关于\(x\)的\(n\)次多项式,我们要求的也就是\(x^k\)的系数
把\(x\)分别带入\(0,1,\cdots,k\),多点插值即可