多项式x组合数学x线性代数 总结

多项式 ( 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)

推式子:

[egin{array} _f(n) &= sumlimits_{i=0}^nsumlimits_{j=0}^n egin{Bmatrix}i\jend{Bmatrix} imes 2^j imes j! \ &= sumlimits_{j=0}^n 2^j j! sumlimits_{i=0}^n egin{Bmatrix}i\jend{Bmatrix} \ &= sumlimits_{j=0}^n 2^j j! sumlimits_{i=0}^n frac{1}{j!} sumlimits_{k=0}^j (-1)^k inom{j}{k} (j-k)^i \ &= sumlimits_{j=0}^n 2^j j! sumlimits_{i=0}^n sumlimits_{k=0}^j frac{(-1)^k}{k!} frac{(j-k)^i}{(j-k)!} \ &= sumlimits_{j=0}^n 2^j j! sumlimits_{k=0}^j frac{(-1)^k}{k!} frac{sumlimits_{i=0}^n(j-k)^i}{(j-k)!} end{array} ]

(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,j}=f_{i-1,j}+f_{i-1,j-1}+f_{i-2,j-1} ]

表示可以不选,也可以单独一组,也可以和前一个球共同组成一组

(F_i)表示(f_i)的生成函数,于是,我们有:

[F_i=F_{i-1}+xF_{i-1}+xF_{i-2} ]

得到(F_i-(x+1)F_{i-1}-xF_{i-2}=0),发现这是个简单的递推,设特征方程:

[lambda^2-(x+1)lambda-x=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+c_2=1 \ c_1lambda_1+c_2lambda_2=x+1 end{cases} ]

解得:(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)

我们可以得出以下两个式子:

[egin{cases} g_{i-1}=f_i+g_i \ g_i imes (frac{1}{n})^m=sumlimits_{j=1}^m border_j imes f_{i+j} imes frac{1}{n}^{m-j} end{cases} ]

第一个表示(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)

所以:

[egin{cases} xG+1=F+G \ G imes frac{1}{n}^m=sumlimits_{i=1}^m border_i imes F imes (frac{1}{n}x)^{m-j} end{cases} ]

我们要求的就是(E(x)=sumlimits_{i=0}^{+infty}[x_i]F(1)')

对第一个式子求导,把(x=1)代入,得

[egin{cases} F(1)'=G(1) \ G(1)=sumlimits_{i=1}^m border_i imes F(1) imes (frac{1}{n})^{m-j} end{cases} ]

又有(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)满足

[prodlimits_{i=1}^{n}dbinom{a_{b_i-1}}{a_{b_i}}mod 2>0 ]


看到组合数和(mod 2),卢卡斯公式便是一个十分自然且优秀的想法

[dbinom{n}{m}=dbinom{n/2}{m/2} imes dbinom{n mod 2}{m 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_{u,s}=frac{1}{d_u}(sumlimits_{v in son}f_{v,s}+f_{fa,s})+1 ]

暴力解需要高斯消元,复杂度显然难以接受,考虑到这是一棵树,尝试分离儿子和父亲的贡献,把(f_i,s)写成关于(f_{fa,s})的函数

(f_{i,s}=A_if_{fa,s}+B_i),重写方程:

[f_{i,s}=frac{1}{du}(sumlimits_{v in son}(A_vf_{i,s}+B_v)+f_{fa,s})+1 ]

移项整理得:

[f_{i,s}=frac{d_u}{(d_u-sum_A)}f_{fa,s}+frac{d_u+sum_B}{(d_u-sum_A)} ]

这样便可一次树形DP求出(f_{x,s})

(F_{x,s})为从(x)出发,至少经过(s)一次的期望步数,则

[F_{x,S}=sumlimits_{T subseteq S}(-1)^{|T|-1}f_{x,T} ]

不需要每次询问都计算一次,可以用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),多点插值即可

原文地址:https://www.cnblogs.com/zjy123456/p/13798927.html