zoukankan      html  css  js  c++  java
  • 数数入门

    前前言

    参考资料

    多项式计数杂谈

    【x义x讲坛】生成函数入门

    膜拜巨佬

    %%%太强啦 Rainbow_sjy❤OI 素质玩家孙1超

    前言

    首先是最基础的一些数数,相信大家都会吧。

    阶乘:从 (1) 乘到 (n) 的结果,记做 (n!)

    排列数:从 (n) 个不同元素中任取 (m(mle n)) 个元素排成一列(考虑元素先后出现次序)称此为一个排列,此种排列的总数即为排列数,记做 (A_n^m) ,有 (A_n^m=frac{n!}{m!})

    组合数:从 (n) 个不同元素中取出 (m(mle n))个元素的所有组合的个数,叫做从 (n) 个不同元素中取出 (m) 个元素的组合数,记做 (C_n^m)( binom{n}{m}) ,有:(C_n^m=frac{n!}{m!(n-m)!})

    这些定义我们后面还可以拓展,但我们现在先不去管它。

    还有一些应该知道的数学基础:

    简单数学基础

    简单微积分入门

    导数的基本运算:

    [egin{aligned} &(F(x)±G(x))^prime=F^prime(x)±G^prime(x)\ &(a imes F(x))^prime=c F^prime(x)\ &(F(x) imes G(x))^prime= F^prime(x)G(x)+F(x)G^prime(x)\ &left(frac{F(x)}{G(x)} ight)'=dfrac{F'(x)G(x)-F(x)G'(x)}{G^2(x)} end{aligned}]

    单项式求导/求原:

    [(x^i)^prime=ix^{i-1}Leftrightarrow int x^idx=frac{x^{i+1}}{i+1} ]

    链式求导法则/复合函数求导:

    [frac{d}{du}frac{du}{dx}=frac{d}{dx}\ ]

    [v(u(x))frac{d}{dx}=v^prime(u(x)) imes u^prime(x) ]

    泰勒展开/麦克劳林级数

    (F^{(n)}(x))(F(x))(n) 阶导数,我们考虑一个多项式,使其在 (x=a) 处零阶导数一阶导数、二阶导数……无穷阶导数与 (F(x)) 的对应导数相同,那么这两个函数就完全相同:

    [F(x)=sumlimits_{i=0}dfrac{F^{(i)}(a)}{i!}(x-a)^i ]

    (x=0) 处泰勒展开

    [F(x)=sumlimits_{i=0}dfrac{F^{(i)}(0)}{i!}x^i ]

    利用这个,我们可以用多项式表示 (exp x)(sin x)(cos x),大家可以自己试试看。

    多项式牛顿迭代

    (G(F(x))=0)

    加入我们已知 (G(F_0(x))=0 pmod {x^n})

    那么有 (F(x)=F_0(x)-frac{G(F_0(x))}{G^prime(F_0(x))} pmod{x^{2n}})

    这个可以用泰勒展开证明:

    [G(F(x))=frac{G(F_0(x))}{0!}+frac{G^prime(F_0(x))}{1!}(F(x)-F_0(x))+frac{G^{primeprime}F_0(x)}{2!}(F(x)-F_0(x))^2+ldots ]

    关注 ((F(x)-F_0(x))^2) ,发现 (F(x))(F_0(x)) 的前 (n) 项是相等的,最低次至少为 (x^n) ,平方后就是 (x^{2n}),再取模是把它给“截断了”

    化简就能得到一开始的结论了。

    例题1:一个方程

    Using the chain rule is like peeling an onion: you have to deal with each layer at a time, and if it is too big you will start crying。

    这里化一个比较麻烦的方程,等下可能会用到:
    (G(x)=xexp frac{2F(x)-F(x)^2}{2-2F(x)}-F(x))

    我们让 (G(x))(F(x)) 求导,可以得到:

    [G^prime(F(x))=x imes exp frac{2F(x)-F(x)^2}{2-2F(x)} imes (frac{2F(x)-F(x)^2}{2-2F(x)})^prime-1= ]

    为了让推导更加简洁,我们令(H(x)=x imes exp frac{2F_0(x)-F_0(x)^2}{2-2F_0(x)}),然后就可以列出迭代式了:

    [egin{aligned} F(x)&=F_0(x)-frac{G(F_0(x))}{G^prime(F_0(x))}\ &=F_0(x)-frac{H(x)-F_0(x)}{H(x) imes (frac{2F_0(x)-F_0(x)^2}{2-2F_0(x)})^prime-1}\ &=F_0(x)-frac{2H(x)-2F_0(x)}{(1+frac{1}{(F(x)-1)^2})H(x)-2} end{aligned}]

    中间跳去的步骤留给读者自己思考我绝对不会说是编辑器太卡了

    阶乘幂引入

    下降幂 :

    [x^{underline{n}}=overbrace{x(x-1)(x-2)ldots(x-n+1)}^{ ext{共}n ext{个因子}} ]

    注意当 (n<0) 时下降幂仍有意义:

    [x^{underline{-n}}=dfrac{1}{(x+1)(x+2)ldots(x+n)} ]

    上升幂:

    [x^{overline{n}}=overbrace{x(x+1)(x+2)ldots(x+n-1)}^{ ext{共 n 个因子}} ]

    类似的有 (n<0)

    [x^{overline{-n}}=dfrac{1}{(x-1)(x-2)ldots(x-n)} ]

    两者统称为阶乘幂

    有一些简单的性质:

    [x^{overline{a+b}}=x^{overline{a}}(x+a)^{overline{b}} ]

    [x^{underline{a+b}}=x^{underline{a}}(x-a)^{overline{b}} ]

    以及上升幂与下降幂的转化:

    [x^{overline{n}}=(-1)^n(-x)^{underline{n}} ]

    [x^{underline{n}}=(-1)^n(-x)^{overline{n}} ]

    来考虑前者:

    [egin{aligned} x^{overline{n}}&=x(x+1)(x+2)ldots(x+n-1)\ &=(-1)^n(-x)(-x-1)(-x-2)ldots(-x-n+1)\ &=(-1)^n(-x)^{underline n} end{aligned} ]

    一些有趣的性质由于笔者还不会就咕咕咕了。

    广义二项式系数&广义二项式定理

    二项式定理:

    [(x+y)^n=sum_{i=0}^n binom{n}{i}x^iy^{n-i} ]

    ( binom{n}{m}) 表示 (n) 个里选 (m) 个的方案数

    [ binom{n}{m}=frac{n!}{m!(n-m)!} ]

    此时要求 (n,m) 都为整数且(mle n)。可以换一种写法:

    [ binom{n}{m}=frac{n^{underline{m}}}{m!} ]

    显然正确。

    现在我们的组合数对于实数也有意义了。因为对于实数为底并不影响下降幂的计算。

    现在我们的二项式定理的 (n) 也就不再局限于正整数了。用 (alpha) 重写柿子,区分一下上式 (其实因为博客里都是α

    [(x+y)^alpha=sum_{i=0}^infty binom{alpha}{i}x^iy^{n-i} ]

    普通的二项式只要取到 (n) 是因为后面的下降幂会变成 (0)

    只需证明 ((1+z)^alpha=sum_{i=0}^infty binom{alpha}{i}z^i) ,然后令 (z=frac{x}{y}) ,两边同乘 (y^alpha) 即可。

    不难发现

    [egin{aligned} ((1+z)^alpha)^{(i)} &=(alpha(1+z)^{alpha-1})^{(i-1)}\ &=(alpha(alpha-1)(1+z)^{alpha-2})^{(i-2)}\ &=ldots\ &=alpha^{underline{i}}(1+z)^{alpha-i} end{aligned} ]

    于是带入麦克劳林级数得到:

    [(1+z)^alpha=sum_{i=0}^inftyfrac{alpha^{underline{i}}}{i!}z^i=sum_{i=0}^infty binom{alpha}{i}z^i ]

    不过要注意当 (z otin(-1,1)) 时上式发散,不过求系数倒是不影响。

    上指标反转

    [ binom{r}{k}=(-1)^k binom{k-r-1}{k} ]

    理解:两数分母字样,分子(r^{underline{k}}=(-1)^k(-r)^{overline{k}}=(-1)^k(k-r-1)^{underline{k}})

    接下来就可以进行一些魔法

    ( binom{2n}{n})的封闭形式

    [sum_{n=0}^infty binom{2n}{n}x^n ]

    考虑下降幂的定义,我们发现

    [egin{aligned} x^{underline{k}}(x-frac12)^{underline{k}}&=frac{2x imes (2x-2) imesldots imes (2k-2k+2) imes (2x-1) imes(2x-3) imesldots imes(2x-2k+1)}{2^{2k}}\ &=frac{2x imes (2x-1) imes (2x-2) imes(2x-3) imes imesldots imes(2k-2k+2) imes(2x-2k+1)}{2^{2k}}\ &=frac{(2x)^{underline{2k}}}{2^{2k}} end{aligned}]

    (x=k=n) ,得到:(n^{underline{n}}(n-frac12)^{underline{n}}=frac{(2n)^{underline{2n}}}{4^n})

    考虑用拆开右边的 ((2n)^{underline{2n}}=(2n)^{underline{n}}n^{underline{n}})

    于是两边就可以消去一些东西了:((n-frac12)^{underline{n}}=frac{(2n)^{underline{n}}}{4^n})

    两边同除 (n!) 得到我们喜闻乐见的组合数:(4^n binom{n-frac12}{n}= binom{2n}{n})

    用一下我们刚刚的指标反转:(4^n(-1)^n binom{-frac12}{n}= binom{2n}{n})

    于是我们就可以来化简了 ( sum_{n=0}^infty binom{2n}{n}x^n=sum_{n=0}^infty binom{-frac12}{n}(-4x)^n)

    于是我们可以得到一个非常优美的柿子:

    [sum_{n=0}^infty binom{2n}{n}x^n=frac{1}{sqrt{1-4x}} ]

    这个柿子我们后面还会用到。

    生成函数

    对于一个数列 (a_0,a_1,a_2,ldots) ,我们可以搞一个函数来描述这个序列,然后就可以用一些数学魔法来解决一些问题。形式化地,我们定义:

    [F(x)=a_0f_0(x)+a_1f_a(x)+a_2f_2(x)+ldots ]

    这里的 (f_k(x)) 我们随便搞出来的标志函数。我们称 (F(x)) 为数列 ({a_0,a_1,a_2,ldots})母函数,也称为生成函数。

    那么现在我们只需要研究函数就可以解决一些实际问题了。

    普通生成函数 (mathbf{OGF})

    如果我们定义 (f_k(x)=x^k) ,就能得到最普通的一类生成函数,即普通生成函数(mathbf{OGF})( m ordinaryquad generatingquad function)),来看一下这个奇怪的函数:

    [F(x)=a_0+a_1x^1+a_2x^2+ldots ]

    例题1:简单背包问题

    现在我们先来看一个简单例题:有 ( m 1g) 的砝码三个, ( m 3g) 的砝码一个, ( m 5g) 的砝码一个,求凑出 ( m 10g) 的方案数。

    当然可以背包,但从生成函数来看,这个答案就是 ((1+x+x^2+x^3)(1+x^3)(1+x^5))(x^{10})的系数,记为 ([x^{10}](1+x+x^2+x^3)(1+x^3)(1+x^5))

    上边的问题为什么可以这么求解?其实本质还是因为多项式乘法:

    [[x^n](F(x) imes G(x))=sum_{i=0}^nF_iG_{n-i} ]

    就类似于 ( m dp) 的思想, 根据乘法原理,(n) 的方案数来自于就是两个子问题的方案,且与多项式乘法惊人地吻合。想通了这一点,上面的例题也就迎刃而解了。

    现在来看几个常用的普通生成函数:

    [oxed{ egin{aligned} &{1,1,1,1,ldots}stackrel{mathbf{OGF}}{longrightarrow}frac{1}{1-x}\ &{overbrace{1,1,1,ldots,1}^n}stackrel{mathbf{OGF}}{longrightarrow}frac{1-x^{n+1}}{1-x}\ &{0,1,0,1,ldots}stackrel{mathbf{OGF}}{longrightarrow}frac{x}{1-x^2}\ &{1,c,c^2,c^3,ldots}stackrel{mathbf{OGF}}{longrightarrow}frac{1}{1-cx}\ end{aligned} } ]

    这里只证明第二个柿子(逃:

    [egin{aligned} 1+&x+x^2+ldots+x^{n-1}+x^n=S&(1)\ &x+x^2+ldots+x^{n-1}+x^n+x^{n+1}=xS&(2)\ end{aligned} ]

    ((2)-(1),x^{n+1}-1=(x-1)S),即(S=frac{1-x^{n+1}}{1-x})

    发现若是 (xin(-1,1)) :

    [lim_{n o +infty}frac{1-x^{n+1}}{1-x}=frac{1}{1-x} ]

    这也就证明了第一个柿子。

    但现在的左右两边只有当(xin(-1,1))才成立。但我们做生成函数只考虑系数,不用管范围。

    其他柿子都是同理。

    例题2:斐波那契数列

    记斐波那契数列的第 (i) 项为 (fib_i) ,那么有: (fib_0=0,fib_1=1,fib_n=fib_{n-1}+fib_{n-2})

    (F(x)=sum_{i=0}^{+infty}fib_ix^i) ,即 (mathbf{OGF}{fib_0,fib_1,fib_2,ldots})

    [egin{alignedat}{2} F(x)&=fib_0+&fib_1 imes x+&fib_2 imes x^2+fib_3 imes x^3+fib_4 imes x^4+ldots(1)\ xF(x)&=&fib_0 imes x+&fib_1 imes x^2+fib_2 imes x^3+fib_3 imes x^4+ldots(2)\ x^2F(x)&=&&fib_0 imes x^2+fib_1 imes x^3+fib_2 imes x^4+ldots(3)\ end{alignedat} ]

    ((2)) 式加 ((3)) 式,由于 (fib_i+fib_{i+1}=fib_{i+2}) ,可以得到:

    [(x+x^2)F(x)=fib_2 imes x^2+fib_3 imes x^3+fib_4 imes x^4ldots ]

    ((1)) 式对比一下,有:

    [F(x)=(x+x^2)F(x)+x ]

    可以得到一个非常优美的柿子:

    [F(x)=frac{x}{1-x-x^2} ]

    称之为封闭形式

    利用这个我们甚至还可以反推通项公式:

    (x_{1,2}) 为方程 (x^2+x-1=0) 的两根,那么就可以把 (frac{x}{1-x-x^2}) 化为我们喜闻乐见的 (frac{1}{1-cx}) 的形式:

    [egin{aligned} F(x)&=-frac{x}{x^2+x-1}=-frac{x}{(x-x_1)(x-x_2)}\ &=frac{x}{x_1-x_2}(frac{1}{x-x_1}-frac{1}{x-x_2})\ &=frac{x}{x_1-x_2}(-frac{1}{x_1}frac{1}{1-x/x_1}+frac{1}{x_2}frac{1}{1-x/x_2})\ &=frac{1}{x_1-x_2}( -frac{1}{x_1}sum_{i=0}^infty frac{x^{i+1}}{x_1^i} +frac{1}{x_2}sum_{i=0}^infty frac{x^{i+1}}{x_2^i} )\ &=frac{1}{x_1-x_2}( -sum_{i=1}^infty frac{x^i}{x_1^i} +sum_{i=1}^infty frac{x^i}{x_2^i} ) end{aligned} ]

    提取系数得到 ([x^n]F(x)=frac{1}{x_1-x_2}(frac{1}{x_2^n}-frac{1}{x_1^n})) ,把 (x_{1,2}) 带入,得到了大名鼎鼎的斐波那契通项公式:

    [fib_n=dfrac{sqrt{5}}{5}left[left(frac{1+sqrt{5}}{2} ight)^{n}-left(frac{1-sqrt{5}}{2} ight)^{n} ight] ]

    思考题: (G(x)=frac{1}{x^2+1}) ,求 ([x^n]G(x) mod 998244353)

    例题3:卡塔兰数

    (C_0=1,C_n=n ext{对括号合法序列数}) ((n>1))

    口胡出递推方程:

    [C_{n+1}=sum_{i=0}^nC_iC_{n-i} ]

    也就是枚举第一对括号里放了多少东西。

    来考虑 (C_i) 的生成函数 (C(x)) ,发现:

    [xC^2(x)+1=C(x) ]

    就是(C(x))自卷、右移一位(对应(n+1))、强制令(C_0=1)

    我们用自身表示了自己,根据求根公式不难得到:

    [C(x)=dfrac{1±sqrt{1-4x}}{2x} ]

    现在出现了两个根,应该取哪一个呢?根据定义,对于一个(mathbf{OGF}) ,当(x o0)时应该是收敛的,那么我们来验证一下:

    • (displaystyle lim_{x o0}dfrac{1+sqrt{1-4x}}{2x})显然不收敛。
    • (displaystyle lim_{x o0}dfrac{1-sqrt{1-4x}}{2x}=1)

    不难知道选负号。

    然后提取系数([x^n]dfrac{1-sqrt{1-4x}}{2x})

    如果你阅读了前面的话应该知道 (displaystyle sqrt{1-4x}=sum_{n=0}^{+infty} binom{frac12}{n}(-4x)^n)

    提取系数就可以发现我们需要的了 (C[n]=-frac{(-4)^{n+1} binom{frac12}{n+1}}{2})

    可以拆广义二项式系数。最终得到:

    [C[n]=frac{ binom{2n}{n}}{n+1} ]

    我们又双叒叕推出了一个(伪)通项。

    例题4:差分与前缀积

    这个我熟,我会 (Theta(nk))

    考虑一个数列 (langle a_0,a_1,a_2, angle) ,对其 (mathbf{OGF}) 做前缀和和差分的结果。

    记当前的生成函数为(F(x))

    对于前缀和,发现 (a_n^prime=sum_{i=1}^na_i imes 1) ,那么构造一个生成函数(G(x)=1+x+x^2+ldots),就有:

    [F^prime(x)=F(x) imes G(x) ]

    (这里的 (F^prime(x)) 指做完前缀和后的生成函数)

    我们知道乘法具有结合律,因此做完 (k) 次后的生成函数就为 (F(x) imes G^k(x))

    对于前缀积,发现

    [F^prime(x)=F(x)-xF(x)=F(x) imes(1-x) ]

    可以理解为:(xF(x)) 可以理解为把整个数列右移。

    于是也可以写成幂形式: (F(x) imes(1-x)^k)

    都看到这里了写个多项式快速幂应该难不倒你吧QwQ

    指数生成函数 (mathbf{EGF})

    我们令 (f_k(x)=frac{x^k}{k!}) 就可以得到指数生成函数(mathbf{EGF})( m exponentialquad generatingquad function))了。

    [F(x)=a_0+frac{a_1x}{1!}+frac{a_2x^2}{2!}+frac{a_3x^3}{3!}+ldots ]

    首先来看一个数列 ({1,1,1,ldots}),ta的 (mathbf{EGF}) 就为

    [F(x)=1+frac{x}{1!}+frac{x^2}{2!}+frac{x^3}{3!}+ldots ]

    惊奇的发现:这不就是 (e^x) 的泰勒展开吗。这也是指数其名字的由来。来看几个比较简单的生成函数:

    [oxed{ egin{aligned} &{1,1,1,1,ldots}stackrel{mathbf{EGF}}{longrightarrow}e^x\ &{1,-1,1,-1,ldots}stackrel{mathbf{EGF}}{longrightarrow} e^{-x}\ &{1,0,1,0,ldots}stackrel{mathbf{EGF}}{longrightarrow} frac{e^x+e^{-x}}{2}\ &{0,1,0,1,ldots}stackrel{mathbf{EGF}}{longrightarrow} frac{e^x-e^{-x}}{2}\ &{1,c,c^2,c^3,ldots}stackrel{mathbf{EGF}}{longrightarrow} e^{cx} end{aligned} } ]

    都可以用泰勒展开得到。

    那么指数生成函数有什么意义呢?

    例题1:数问题

    用两个(1),两个(3),一个(5),能排成多少个不同的四位数?

    [mathbf{EGF}{1,1,1} imesmathbf{EGF}{1,1} imesmathbf{EGF}{1,1} ]

    提取 (frac{x^4}{4!}) 的系数即为答案。

    还是考虑多项式乘法,我们设(A(x) imes B(x)=C(x))(frac{C_n}{n!}=sum_{i=0}^nfrac{A_i}{i!}frac{B_{n-i}}{(n-i)!}),可以写成组合数的形式:

    [C_n=sum_{i=0}^n binom{n}{i}A_iB_{n-i} ]

    可以理解成对 (A)(B) 内部的方案放到大小为 (n) 的序列中,对其中 (i) 个位置选用 (A) 内部的方案,剩下的位置选用 (B) 的方案。在回顾例题就迎刃而解了。

    例题2:染色问题

    用红蓝绿三种颜色,涂一个长度为 (n) 的纸条,使得红色和蓝色的个数是偶数,求方案数。

    这显然符合我们刚刚的 (mathbf{EGF}) ,分别考虑三种颜色的:

    • 红色和蓝色是偶数 ({1,0,1,0,ldots}stackrel{mathbf{EGF}}{longrightarrow} frac{e^x+e^{-x}}{2})
    • 绿色是任意数 ({1,1,1,1,ldots}stackrel{mathbf{EGF}}{longrightarrow}e^x)

    把这三者乘起来就是答案的 (mathbf{EGF})

    [(frac{e^x+e^{-x}}{2})^2e^x=frac{e^{3x}+2e^{x}+e^{-x}}{4} ]

    提取系数(也可以理解为还原 (mathbf{EGF}) )得到:(frac{3^n+2+(-1)^n}{4})

    例题3:无聊的水题 I

    有一说一确实又无聊又水

    一棵有编号无根树唯一对应一个prufer序列,并且,度数为其在序列中的出现次数加 (1) 。我们希望能求出满足的序列数使其出现的最大次数为 (M-1)

    最大次数恰好为 (M-1) 不太好做,考虑差分:

    • ( ext{至多M-1次}- ext{至多M-2次}= ext{恰好M-1次})

    于是剩下的就是套路了。

    于是对每一个节点写出在序列中的 (mathbf{EGF}):

    [F(x)=sum_{i=0}^mfrac{x^i}{i!} ]

    每个节点的生成函数都是一样的,答案的生成函数就是(F^N(x))

    对于(m=M-1,M-2)分别求值做差即可。

    概率生成函数 (mathbf{PGF})

    概率生成函数与上面两种略有不同,先来看一下概率生成函数((mathbf{PGF}),( m probabilisticquad generatingquad function))

    (P(A))(A) 为真的概率。

    对于一个离散随机变量 (X):

    [F(x)=sum P(X=i)x^i ]

    这个不太好看的柿子有很多神奇的结论:

    1. 根据定义显然有 (sum P(X=i)=1),即(F(1)=1)
    2. (E(X)=sum_{i}P(X=i)i=F^prime(1))
    3. 方差也咕咕咕了

    其实等于号可以改成大于号,不过上面的性质就不满足了。

    很多时候概率生成函数只是一个工具,实际使用中最后的结果往往与其无关。

    直接看例题吧。

    例题1:[CTSC2006]歌唱王国

    (F_i) 为恰好到第 (i) 次结束的概率,(G_i) 表示到第 (i) 次还未结束的概率。(F(x))(G(x)) 分别为两者的 (mathbf{PGF})

    那么唱一个数,要么结束要么没结束,因此有:

    [F(x)+G(x)=xG(x)+1 ]

    对比系数,左边 ([x^n]) 表示 (n) 次恰好结束与 (n) 次还未结束的概率,右侧 ([x^n]xG(x)=G[n-1]) ,就是 (n-1)次未结束的概率。因为一定会结束,所以两者相等。

    两边同时求导:

    [egin{aligned} F^prime(x)+G^prime(x)&=xG^prime(x)+G(x)\ F^prime(1)&=G(1) end{aligned} ]

    利用到字符串本身的一些性质。对于序列 (A),如果 (A[1:i]=A[len-i+1:len]) ,即又是前缀又是后缀,那么称其为一个 ( m border)

    能够写出一个奇怪的等式:

    [G(x) imes(frac1mx)^L=sum_{A[1:i] m is border}F(x) imes(frac1mx)^{L-i} ]

    左边是强制令其结束,右边是因为强制结束时可能已经结束,此时必定最后是一个 ( m border) (可以画个图理解一下)

    高清大图

    那么把 (x=1) 就可以出答案了

    [F^prime(1)=G(1)=sum_{A[1:i] m is border}F(1)m^i=sum_{A[1:i] m is border}m^i ]

    然后hash kmp就十分简单了。

    例题2: [SDOI2017]硬币游戏

    把上一题扩展一下,就可以做这道题了。

    我们用 (F_k[i]) 表示第 (k) 个人走 (i) 步结束(即胜利)的概率, (G[i]) 表示走 (i) 步还未结束的概率, (F_k(x))(G(x)) 为它们的 (mathbf{PGF}) ,不难发现下面两个等式:

    [egin{aligned} &sum_{i}F_i(1)=1\ &G(x)+sum_{i}F_i(x)=xG(x)+1 end{aligned}]

    第一个等式是因为必然会结束,第二个是例题1的等式扩展到多个串的情况。我们要求的即为 (F_i(1)) 。考虑在 (G[i]) 后面加一个串强制令其结束,设加的是第 (i) 个串。

    [G(x) imes(frac12x)^L=sum_{j}sum_{A_i[1:k]=A_j[L-k+1,L]}F_j(x) imes(frac12x)^{L-k} ]

    (x=1) 得到:

    [G(1)=sum_{j}sum_{A_i[1:k]=A_j[L-k+1,L]}F_j(1) imes 2^k ]

    在结合第一个等式,我们就可以列出 (n+1) 个方程,恰好有 (n+1) 个未知数。高斯消元即可。

    生成函数&卷积进阶

    一些讨论整理在这里。

    (exp) 的组合意义

    众所周知 (exp x)(sumlimits_{i=0}^inftydfrac{x^i}{i!}) ,那么 (exp F(x)) 会得到什么呢?
    先暴力展开在说:

    [exp F(x)=sum_{i=0}^inftyfrac{F^i(x)}{i!} ]

    这个东西是有组合意义的。假如 (F(x)) 是“单个元素”的 (mathbf{EGF}) ,那么 (exp F(x)) 就是把这些元素拼接起来的 (mathbf{EGF})

    展开式就相当于枚举有几个元素,多次卷积拼接,由于元素之间无序需要除以个数的阶乘。

    例题1:[集训队作业2013]城市规划

    如果我们用 (F[i]) 表示 (i) 个点组成的连通图个数,(G[i]) 表示 (i) 个点组成的 的个数,(F(x))(G(x)) 分别为它们的 (mathbf{EGF})

    可以认为是若干个 连通图 组成了一张图,因此可以有:(exp F(x)=G(x))

    于是 (F(x)=ln G(x))(G(x)) 是很好求的,因为 (G[i]=2^{ binom{i}{2}})

    例题2:有标号荒漠计数

    • 先来考虑仙人掌怎么做

    本来是无根的,我们强制令其有根。因为有标号,有根方案数除以节点数就是无根方案数。

    (F(x)) 表示方案数的 (mathbf{EGF})

    那么我们先钦定一个点为根,那么这个点可以这样连边:

    情况一 情况二 情况三 ...
    ...
    (F(x)) (frac{F(x)^2}{2}) (frac{F(x)^3}{2}) ...

    除以 (2) 是因为顺时针与逆时针是一种方案。这部分的生成函数就是 (displaystyle F(x)+frac12sum_{i=2}F(x)^i)

    这只是根上的一个基本单位,可以由任意个组成,不难写出方程:

    [F(x)=xexp(F(x)+frac12sum_{i=2}^infty F(x)^i) ]

    后面一串是一个等比数列求和。拆开来就变成 (expfrac{2F(x)-F(x)^2}{2-2F(x)})

    熟不熟悉?

    (F(x))(x^i) 除以 (i) 就得到无根有标号仙人掌的数目了。以下的 (F(x)) 指无根。

    那么现在荒漠的 (mathbf{EGF}) 就是 (exp F(x))

    差/和卷积

    在实际卷题的过程中,我们的卷积形式可能不是很明显,比如下边这个柿子:(H[j]=sum_{i=j}^nF[i] imes G[i-j])

    但是这个东西也是可以求的,我们只需要翻转 (F) 得到 (F_R) ,在翻转 (H) 得到 (H_R),就可以得到显然的卷积式: (H_R[n-j]=sum_{i=j}^nF_R[n-i] imes G[i-j]) ,这个式子就可以直接卷了。

    同样还有类似的和卷积,思路还是翻转形成卷积。

    [H[j]=sum_{i=0}F[i] imes G[i+j] ]

    我们翻转 (F) 得到 (F_R) ,并把 (H) 整体 (n) 右移可以得到:

    [H[n+j]=sum_{i=0}F_R[n-i] imes G[i+j] ]

    实战中常常会用到类似的套路。

    Bluestein's algorithm

    Bluestein's algorithm 算法可以在 (Theta(nlog n))的时间内完成任意长度的 (mathbb{DFT})

    具体来说是这样的:

    [egin{aligned} y_k&=sum_{i=0}^{n-1}a_iomega_n^{ki}\ &=sum_{i=0}^{n-1}a_iomega_{2n}^{-(k-i)^2 +k^2+i^2}\ &=omega_{2n}^{k^2}sum_{i=0}^{n-1}a_i omega_{2n}^{i^2} imesomega_{2n}^{-(k-i)^2} end{aligned} ]

    可以理解为拆指数形成卷积形式。但有些毒瘤题目中可能会不保证 (omega_{2n}) 存在,因此下面介绍另一种常用方法:

    [egin{aligned} y_k&=sum_{i=0}^{n-1}a_iomega_n^{ki}\ &=sum_{i=0}^{n-1}a_iomega_n^{inom{k+i}{2}-inom{i}{2}-inom{k}{2}}\ &=omega_{n}^{-inom{k}{2}}sum_{i=0}^{n-1}a_iomega_n^{-inom{i}{2}} imesomega_n^{inom{k+i}{2}} end{aligned} ]

    这个形式显然可以卷积了。可以参见上文的 差/和卷积

    单位根反演

    有公式

    [[n|k]=frac1nsum_{i=0}^{n-1}omega_n^{ik} ]

    证明直接分类讨论即可:

    • (n|k)(omega_n^{ik}=1) ,上式显然等于 (1)
    • (n ot | k),等比数列求和得到:(dfrac{1}{n} imes dfrac{omega_n^{nk}-omega_n^0}{omega_n^k-1}=0)

    可以直接记结论。

    例题1:小猪佩奇学数学

    给定 (n,p,k) 询问 (sum_{i=0}^n inom n i imes p^{i} imes leftlfloor frac{i}{k} ight floor mod 998244353)

    (kin{2^{w}|0leq wleq20})就是在保证单位根的存在。

    然后就爆推式子。

    向下取整可以拆成容易算的 (lfloorfrac{i}{k} floor=frac{i-i mod k}{k})

    原式就可以写成 (frac{1}{k}(sum_{i=0}^n binom{n}{i}p^ii-sum_{i=0}^n binom{n}{i}p^i(imod k)))

    分开来看式子。

    由于组合数的定义: ( binom{n}{i}i=frac{n!}{i!(n-i)!}i=frac{n(n-1)!}{(i-1)!(n-i)!}= binom{n-1}{i-1}n)

    [egin{aligned} &sum_{i=0}^n binom{n}{i}p^ii\ &=sum_{i=1}^n binom{n-1}{i-1}np^i\ &=npsum_{i=0}^{n-1} binom{n-1}{i}p^{i}\ &=np(p+1)^{n-1} end{aligned} ]

    [egin{aligned} &sum_{i=0}^nsum_{t=0}^{k-1}[imod k=t] binom{n}{i}p^it\ &=sum_{i=0}^nsum_{t=0}^{k-1}[k|(i-t)] binom{n}{i}p^it\ &=sum_{i=0}^nsum_{t=0}^{k-1}frac{1}{k}sum_{j=0}^{k-1}omega_k^{j(i-t)} binom{n}{i}p^it\ &=frac{1}{k}sum_{j=0}^{k-1}sum_{t=0}^{k-1}tomega_k^{-tj}sum_{i=0}^n binom{n}{i}(omega_k^jp)^i\ &=frac{1}{k}sum_{j=0}^{k-1}sum_{t=0}^{k-1}tomega_k^{-tj}(omega_k^jp+1)^n end{aligned} ]

    所以只需要对于(jin[0,k))求出后面一串的值就行了。可以使用Bluestein's Algorithm拆指数具体过程就不展开了。

    最后能得到:

    [frac{1}{k}sum_{j=0}^{k-1}omega_k^ binom{j}{2}(omega_k^jp+1)^nsum_{t=0}^{k-1}tomega_k^{ binom{t}{2}} imes omega_k^{- binom{t+j}{2}} ]

    这就可以卷积了。不过注意 (omega_k^{- binom{t+j}{2}}) 的数组要倍长。

    例题2:[HNOI2019]白兔之舞

    与上一题类似的操作,不过涉及一点点矩阵。

    (g_{i,j})为走了(i)步到第二维为(j)的顶点(不钦定走那些列)的方案数,有:

    [g_{i,j}=sum_{k=1}^ng_{i-1,k}w_{k,j} ]

    若记 (G_i=(g_{i,1},g_{i,2},ldots,g_{i,n}))$

    [G_0=(underbrace{0,ldots,0}_{x-1},1,underbrace{0,ldots,0}_{n-x}) ]

    [S= egin{pmatrix} w_{1,1}&cdots&w_{1,n}\ vdots&ddots&vdots\ w_{n,1}&cdots&w_{n,n} end{pmatrix} ]

    有:(G_i=G_{i-1} imes S),即(G_i=G_0 imes S^i)

    但此时我们没有考虑白兔兔每次走了几步。所以我们还需要考虑(i)步走了那些列。实际上就是在(L)个位置上选了(i)个位置跳,也就是( binom{L}{i}g_{i,j}= binom{L}i(G_0S^i)_{1,y})

    那么此时我们已经表示出跳了(i)的方案数。来考虑答案,列出式子开始乱推:

    [egin{aligned} ans_t&=sum_{i=0}^L[imod k=t] binom{L}{i}g_{i,y}=sum_{i=0}^L[k|(i-t)] binom{L}{i}g_{i,y}\ &=sum_{i=0}^Lfrac{1}{k} binom{L}{i}g_{i,y}sum_{j=0}^{k-1}omega_{k}^{(i-t)j}=frac{1}{k}sum_{i=0}^L binom{L}{i}g_{i,y}sum_{j=0}^{k-1}omega_{k}^{ij}omega_{k}^{-tj}\ &=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}sum_{i=0}^L binom{L}{i}g_{i,y}omega_{k}^{ij}\ &=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}sum_{i=0}^L binom{L}{i}omega_{k}^{ij} imes(G_0S^i)_{1,y} end{aligned} ]

    矩阵那部分事实上也可以先提取公因式再求和再取下标,即:

    [egin{aligned} &=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}(G_0sum_{i=0}^L binom{L}{i}omega_{k}^{ij} imes S^i)_{1,y}\ &=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}(G_0sum_{i=0}^L binom{L}{i}(omega_{k}^{j} imes S)^i)_{1,y}\ &=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}(G_0sum_{i=0}^L binom{L}{i}(omega_{k}^{j} imes S)^iI^{L-i})_{1,y}\ &=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}(G_0(omega_k^jS+I)^L)_{1,y} end{aligned} ]

    如果我们记(f_i=(G_0(omega_k^iS+I)^L)_{1,y}),就可以吧答案写成比较简单的形式。

    [ans_t=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{-tj}f_j ]

    然后就是 有手就行Bluestein's algorithm了。

    [egin{aligned} ans_t&=frac{1}{k}sum_{j=0}^{k-1}omega_{k}^{- binom{t+j}{2}+ binom{t}{2}+ binom{j}{2}}f_j\ &=frac{omega_{k}^ binom{t}{2}}{k}sum_{j=0}^{k-1}omega_{k}^{- binom{t+j}{2}} imes omega_{k}^ binom{j}{2}f_j end{aligned} ]

    卷积就不难了。

    二项式反演

    有时做题中恰好等词不是怎么好做,我们使用二项式反演可以由至少得到他。(这个至少其实是假的,如果真正意义上的至少只需要差分就行了

    [F[n]=sum_{i=0}(-1)^iinom{n}{i}G[i]Longleftrightarrow G[n]=sum_{i=0}(-1)^idbinom{n}{i}F[i] ]

    以及另两种常用的形式

    [F[n]=sum_{i=0}inom{n}{i}G[i] Longleftrightarrow G[n]=sum_{i=0}^n(-1)^{n-i}inom{n}{i}F[i] ]

    [F[n]=sum_{i=n}inom{i}{n}G[i] Longleftrightarrow G[n]=sum_{i=n}(-1)^{i-n}inom{i}{n}F[i] ]

    例题1:[HAOI2018]染色

    (G[k]) 表示有 (k) 种颜色恰好出现了 (S)

    那么我们尝试先钦定 (k) 种颜色,并强行令其出现恰好 (S) 次,我们记做 (F[k]) ,不难有:

    [F[k]=inom{m}{k}frac{n!}{(S!)^k(n-kS)!}(m-k)^{n-kS} ]

    考虑这么算对于一个恰好(i) 个情况,会计算(inom{i}{k}) 遍,因为同样是恰好 (i) 个,钦定的 (k) 个不同会重复计算。

    于是:

    [F[n]=sum_{i=n}inom{i}{n}G[i] Longleftrightarrow G[n]=sum_{i=n}(-1)^{i-n}inom{i}{n}F[i] ]

    这个东西也可以卷,拆开组合数就十分明显了QwQ。

    [egin{aligned} G[n]&=sum_{i=n}(-1)^{i-n}frac{i!}{n!(i-n)!}F[i]\ &=frac{1}{n!}sum_{i=n} i!F[i] frac{(-1)^{i-n}}{(i-n)!} end{aligned} ]

    可以参见 差/和卷积

    例题2:[CTS2019]珍珠

    记颜色(c)(cnt_c)个,一种方案合法当且仅当:(sum_{i=1}^Dcnt_imod 2le m)

    简单推导得到:(sum_{i=1}^Dcnt_imod 2le n-2m)。注意两种情况需要特判。

    记恰好有(k)个为奇数方案为(G[k])至少(k)个为奇数的方案为(F[k])

    [F[n]=sum_{i=n}inom{i}{n}G[i] Longleftrightarrow G[n]=frac{1}{n!}sum_{i=n} i!F[i] frac{(-1)^{i-n}}{(i-n)!} ]

    ( ext{方案的生成函数=选k个生成函数} imes ext{强制奇数生成函数} imes{放任自流生成函数})

    [egin{aligned} F[k]=& binom{D}{k}n![x^n](frac{e^x-e^{-x}}{2}^k)(e^x)^{D-k}\ =& binom{D}{k}frac{n!}{2^k}[x^n]sum_{j=0}^k binom{k}{j}(-1)^{k-j}e^{x(D-2(k-j))} end{aligned}]

    (e^{ax}=1+frac{ax}{1!}+frac{a^2x^2}{2!}+frac{a^3x^3}{3!}+ldots),即 (e^{ax})(mathbb{EGF}<1,a,a^2,a^3,dots>)([x^n]e^{ax}=frac{a^n}{n!})

    [egin{aligned} =& binom{D}{k}frac{1}{2^k}sum_{j=0}^k binom{k}{j}(-1)^{k-j}(D-2(k-j))^n\ =&frac{D!}{(D-k)!2^k}sum_{j=0}^k frac{(-1)^j(D-2j)^n}{j!} imesfrac{1}{(k-j)!}\ end{aligned}]

    (ln)(exp) 优化无限背包

    (mathbf{OGF}) 的例题中我们已经知道可以用其求背包的方案数,就是各部分的 (mathbf{OGF}) 的积。在选无限个的情况下,我们可以通过 (ln) 把求集变成求和,再用 (exp) 还原。

    通常有下面的形式:

    [ln(frac{1}{1-x^i})=sum_{j=1}^infty frac{x^{ij}}{j} ]

    证明:
    (ln frac{1}{1-x_i}=-ln(1-x_i))

    对右式求导得到:((-ln(1-x_i))^prime=frac{ix^{i-1}}{1-x^i})

    我们知道:(frac{1}{1-x^i})就是(1+x_i+x^{2i}+ldots)的封闭形式,即(sum_{j=0}^{+infty}x^{ij})

    带回,有:(frac{ix^{i-1}}{1-x^i}=sum_{j=0}^{+infty}ix^{i(j+1)-1}=sum_{j=1}^{+infty}ix^{ij-1})

    那么

    [lnfrac{1}{1-x^i}=int sum_{j=1}^{+infty}ix^{ij-1} dx=sum_{j=1}^{+infty}frac{x_{ij}}{j} ]

    例题1:付公主的背包

    对于体积为 (V) 的物品,其生成函数为 (1+x^V+x^{2V}+ldots=frac{1}{1-x^V})

    于是答案的生成函数 (F(x)) 就是所有乘起来。

    [F(x)=prod_ifrac{1}{1-x^{V_i}} ]

    两边同取 (ln) 就能去掉乘积了。

    [ln F(x)=sum_ilnleft(frac{1}{1-x^{V_i}} ight) ]

    在用刚刚的式子。

    [ln F(x)=sum_isum_{j=1}^infty frac{x^{V_ij}}{j} ]

    我们只需要前 (n) 项。如果我们记 (V_i=k) 的次数为 (cnt_k) ,那么:

    [ln F(x)=sum_isum_{j=1}^infty frac{cnt_ix^{ij}}{j} ]

    这个可以用调和级数 (Theta(nln n)) 填系数。

    例题2:[SDOI2017] 遗忘的集合

    首先考虑 (a_iin{0,1}) 表示第 (i) 个数选还是不选,不难发现第 (i) 个数的 (mathbf{OGF}) 就为 (1+a_i(x^i+x^{2i}+x^{3i}+ldots)) ,封闭形式为 ((frac{1}{1-x^i})^{a_i})

    随便推导一下得到:

    [ln F(x)=sum_{i=1}a_isum_{j=1}frac{x^{ij}}{j} ]

    做过莫反的都知道,可以设(T=ij)

    [ln F(x)= sum_{T=1}(sum_{i|T}a^i imesfrac iT)x^T]

    [T[x^T]ln F(x)=sum_{i|T}a_i imes i ]

    中间的狄利克雷卷积已经很明显了。设两个数论函数 (f(T)=T[x^T]ln F(x))(g(T)=a_T imes T) ,那么: (f=g * I)
    两边同乘 (mu) 得到:

    [f*mu=g*I*mu=g*(I*mu)=g*varepsilon=g ]

    (Theta(nln n))(f*mu)即可

  • 相关阅读:
    laravel吐槽系列之一
    每日晨读_20140924
    技术晨读_2014_9_1
    大话胖model和瘦model
    大话PHP缓存头
    vim黏贴自动增加tab的毛病
    Laravel学习
    郑捷2017年电子工业出版社出版的图书《NLP汉语自然语言处理原理与实践》
    delete
    NLP知识结构概述
  • 原文地址:https://www.cnblogs.com/juruo-cjl/p/14319281.html
Copyright © 2011-2022 走看看