• 多项式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),多点插值即可

  • 相关阅读:
    js中'1'到1的转换
    js类型判断
    docker安装mysql5.7
    HMM隐马尔可夫模型学习
    [python] wgs84转为gcj02坐标
    python经纬度转enu坐标
    Centos7开放及查看端口
    设计模式笔记
    npm 全面介绍
    Yarn 安装与使用详细介绍
  • 原文地址:https://www.cnblogs.com/zjy123456/p/13798927.html
Copyright © 2020-2023  润新知