多项式 ( imes) 组合数学 ( imes) 线性代数
这是一篇总结......
Part 1 多项式
OI中的多项式常见的就是推卷积式子和生成函数,一般很少出现直接给式子的题目,与组合数学的联系相对比较紧密
[HEOI2016/TJOI2016] 求和
计算(f(n)=sumlimits_{i=0}^nsumlimits_{j=0}^i egin{Bmatrix}i\jend{Bmatrix} imes 2^j imes j!),其中(egin{Bmatrix}i\jend{Bmatrix})为第二类斯特林数
考虑到(i<j)时(S(i,j)=0)
推式子:
(sumlimits_{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_1lambda_1^i+c_2lambda_2^i),代入(F_0,F_1)
解得:(egin{cases}c_1=frac{(x+1)+sqrt{x^2+6x+1}}{2sqrt{x^2+6x+1}}\c_2=frac{-(x+1)+sqrt{x^2+6x+1}}{2sqrt{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}}{2sqrt{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=sumlimitslimits_{i=0}^{+infty}a_ix^i)
概率生成函数有以下性质:
-
(F(1)=sumlimits_{i=0}^{+infty}a_i=1)
-
(E(x)=sumlimits_{i=0}^{+infty}ia_i=sumlimits_{i=0}^{+infty}[x_i]F(1)')
-
[egin{array} _D(x) &=E[(x-E(x))^2] \ &=E(x^2)-E(x)^2 \ &=sumlimits_{i=0}^{+infty}[i(i-1)+i]a_i-[sumlimits_{i=0}^{+infty}[x_i]F(x)']^2 \ &=sumlimits_{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)=sumlimits_{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}egin{bmatrix}n-1\A+B-2end{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 ightarrow b),记(w(u,v)=sumlimits_{P:a ightarrow b}prodlimits_{e in P}w_e)
记(G=egin{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|=sumlimits_{(P_1,cdots,P_n):A ightarrow B} sign(sigma(P))prodlimits_{i=1}^nprodlimits_{e in P_i} w_e)
即(|G|)是所有(A)到(B)的不相交路径(P:(P_1,cdots,P_n))的带符号和
倘若把边权设为1,得到的就是不相交路径的方案数
[模板]LGV引理
给出一个(n imes 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),多点插值即可