数学知识:和式的处理及二项式系数的运用

这段时间看了一部分《具体数学》上的内容,正如第一章中所说,这本书的主要目的是:

说明不具备超人洞察力的人如何求解问题

也就是说,这本书主要讲述的是“那些本应该被讲授的硬数学技巧”。或者说是一种数学领域的通用技术,这也是“具体数学”名称的来源。

一、 和式

记号


与平时所用的∑nk=1\sum_{k=1}^n记号不同,这本书建议使用更加方便的形如∑1≤k≤n\sum_{1\le k\le n}的记号,这可以使你在变量替换时不容易出错。

一个特殊的地方是逻辑判断深入和式:用方括号包含的逻辑命题,如果为真则为1,如果为假则为0。这对于(cpp)程序编写是非常友好的。

运算律


和式满足下面三种基本运算律:

  1. 分配律(提公因式):

    ∑k∈Kcak=c∑k∈Kak

    \sum_{k\in K} ca_k = c\sum_{k\in K}a_k

  2. 结合律(和式的合并):
    ∑k∈K(ak+bk)=∑k∈Kak+∑k∈Kbk

    \sum_{k\in K}(a_k+b_k)=\sum_{k\in K}a_k + \sum_{k\in K} b_k

  3. 交换律(变量替换):

    ∑k∈Kak=∑p(k)∈Kap(k)

    \sum_{k\in K}a_k=\sum_{p(k)\in K}a_{p(k)}

    p(k)p(k)为一个置换


多重和式具有一些特殊的性质,例如:

  1. 合并和分离:

    ∑1≤i≤n∑i≤j≤nai,j=∑1≤i≤j≤nai,j

    \sum_{1\le i\le n}\sum_{i\le j\le n} a_{i,j} = \sum_{1\le i\le j\le n} a_{i,j}

  2. 交换求和顺序:
    ∑1≤i≤n∑i≤j≤nai,j=∑1≤j≤n∑1≤i≤jai,j

    \sum_{1\le i\le n}\sum_{i\le j\le n} a_{i,j} = \sum_{1\le j\le n}\sum_{1\le i\le j} a_{i,j}

  3. 一般分配律:
    ∑j∈J,k∈Kajbk=⎛⎝∑j∈Jaj⎞⎠(∑k∈Kbk)

    \sum_{j\in J, k\in K}a_jb_k=\left(\sum_{j\in J}a_j\right)\left(\sum_{k\in K}b_k\right)

这些性质虽然是显然的,但将在处理时带来巨大的方便。第二条有助于化简和式,第三条则可以在一些“求乘积的和”的计算时减小计算量。

一般技术


1. 猜测+归纳法

虽然名字不是很好听,但这在OI中是一种实用的策略。因为计算机暴力处理的速度是很快的,如果规律明显,往往可以一眼看出。而归纳证明就非常简单了。

2. 扰动法

扰动法的动机是在和式中加入一项,并用一个新和式表达之,从而解方程得出通解。用两个例子来解释这种方法:

(一): 几何级数

Sn=∑0≤k≤nak

S_n = \sum_{0\le k\le n}a^k

的封闭形式。

用扰动法加入一项:

Sn+an+1=1+∑0≤k≤nak+1=1+aSn

S_n + a^{n+1} = 1 + \sum_{0\le k\le n}a^{k+1} = 1+aS_n

解方程可以得出 Sn=an+1−1a−1S_n = \frac {a^{n+1}-1}{a-1}。对这个公式两边微分可以得到一个有用的公式:

∑1≤k≤nkak−1=1−(n+1)xn+nxn+1(1−x)2

\sum_{1\le k\le n}ka^{k-1} = \frac {1-(n+1)x^n+nx^{n+1}}{(1-x)^2}

当|a|<1|a|时可以收敛成:

∑1≤k≤nkak−1=1(1−a)2

\sum_{1\le k\le n}ka^{k-1}=\frac 1{(1-a)^2}

(二): 平方和公式

考虑求

Sn=∑1≤k≤nk2

S_n = \sum_{1\le k\le n} k^2

的封闭形式。

如果仍然用刚才的思路,我们会发现SnS_n在两边抵消了。但如果我们用三次方和VnV_n进行扰动:

Vn+(n+1)3=∑0≤k≤n(k+1)3=∑0≤k≤nk3+3∑0≤k≤nk2+3∑0≤k≤nk+∑0≤k≤n1=Vn+3Sn+3n(n+1)2+n+1

V_n + (n+1)^3 \\ = \sum_{0\le k\le n} (k+1)^3\\ = \sum_{0\le k\le n}k^3+3\sum_{0\le k\le n}k^2+3\sum_{0\le k\le n}k+\sum_{0\le k\le n}1\\ = V_n+3S_n+\frac {3n(n+1)}{2}+n+1

两边的VnV_n可以抵消,我们解出了SnS_n。即:

Sn=n(n+1)(2n+1)6

S_n = \frac {n(n+1)(2n+1)}{6}

3. 待定系数法

如果已知解的形式,我们可以用待定系数法得到原和式的封闭形式。例如:

∑1≤k≤nk3

\sum_{1\le k\le n}k^3

先验知识告诉我们答案是一个44次多项式。我们只要代入n=0,1,2,3n=0,1,2,3建立关于一般四次多项式的44个方程即可求解。事实上,如果用拉格朗日插值法或高阶差分法,可以在O(n2)O(n^2)的时间内完成,是非常高效的。

4. 有限微积分

下一部分详细介绍。

有限微积分

基本定义


有限微积分是离散数学对于微积分的回应,这种技术给出了求解和式的“不需要思考”的系统方法。考虑熟悉的微分算子的定义:

Df(n)=limh→0f(n+h)−f(n)h

Df(n)=\lim_{h\rightarrow 0}\frac {f(n+h)-f(n)}{h}

而离散中的“极限”就是1,自然地定义差分算子:

Δf(n)=f(n+1)−f(n)

\Delta f(n) = f(n+1)-f(n)

“算子(operator)”这个新概念是作用在函数上的运算,他给出了一个新函数。

简单的公式


微积分之所以方便是因为它有形如:

D(xm)=mxm−1

D(x^m) = mx^{m-1}

这样的优美公式,同样,有限微积分也有对应的优美的公式:

Δ(xm−−)=mxm−1−−−

\Delta(x^{\underline{m}}) = mx^{\underline{m-1}}

其中:xm−−=x(x−1)(x−2)…(x−m+1)x^{\underline{m}} = x(x-1)(x-2)\dots (x-m+1)(m个),被称为下降阶乘幂。由于可以证明任何的xkx^k都在O(k2)O(k^2)内可以写成阶乘幂的和(具体方法为从高到低贪心的取),因此他的能力十分强大。

求和——离散的“积分”


微积分中可以用微分算子定义不定积分,也就是:

∫g(x)dx=f(x)+C⟺g(x)=Df(x)

\int g(x)dx = f(x)+C\iff g(x)=Df(x)

我们用同样的方式定义不定和式:

∑g(x)δx=f(x)+C⟺g(x)=Δf(x)

\sum g(x)\delta x=f(x)+C\iff g(x) = \Delta f(x)

微积分基本定理指出:

∫bag(x)dx=f(b)−f(a)

\int_a^bg(x)dx = f(b)-f(a)

同样有有限微积分基本定理:

Σbag(x)δx=f(b)−f(a)

\Sigma_a^b g(x) \delta x = f(b)-f(a)

但这些记号的直观意义是什么呢?不难证明:

Σbag(x)δx=∑a≤i<bg(i),b≥a

\Sigma_a^b g(x) \delta x = \sum_{a\le i

这是最有用的定理之一(如果之前学习过数列差分这几乎是显然的)。我们正要用他解决序列求和的问题。

负指数下降阶乘幂


通过类比可以定义负指数下降阶乘幂:

x−m=1(x+1)(x+2)…(x+m),m>0

x^{-m} = \frac 1 {(x+1)(x+2)\dots (x+m)}, m>0

可以证明仍然满足差分公式。而且这使得下降幂拥有了良好的性质:

xm+n−−−=xm−−(x−m)n−

x^\underline{m+n}=x^\underline m(x-m)^\underline n

重新发现平方和公式


这次我们用新的武器来重新发现这个公式:

Sn=Σn+10x2δx

S_n = \Sigma_0^{n+1} x^2\delta x

用下降阶乘幂x2=x2−+x1−x^2 = x^\underline 2+x^\underline 1,用线性性质:

Sn=Σn+10x2−δx+Σn+10x1−δx

S_n = \Sigma_0^{n+1} x^\underline 2\delta x+\Sigma_0^{n+1}x^\underline 1 \delta x

两边的不定和式分别是:

∑x2−δx=13x3−

\sum x^\underline 2\delta x = \frac 1 3x^\underline 3

∑x1−δx=12x2−

\sum x^\underline 1\delta x = \frac 1 2x^\underline 2

那么原和式就变成:

Sn=13(n+1)3−+12(n+1)2−

S_n = \frac 1 3 (n+1)^\underline 3+\frac 1 2(n+1)^\underline 2

展开和上面的公式完全相同。(但在具体应用中我们不必展开,因为阶乘幂也可以用类似霍纳法则的方法将求值降到O(n)O(n)。)

乘法公式和分部求和公式


微积分中的链式法则在有限微积分中很难推广,唯一的一个是:

fm−−(n)=mfm−1−−−(n)

f^\underline m(n) = mf^\underline {m-1}(n)

f(x)f(x)是任一函数。但这显然不能满足我们的要求,一个更强大的是乘法公式,即:

Δ(uv)=uΔv+EvΔu

\Delta(uv) = u\Delta v+Ev\Delta u

其中Ef(x)=f(x+1)Ef(x) = f(x+1),被称为移位算子。(有趣的是:Δ=E−1\Delta = E-1)。

证明十分简单,只要从定义出发就可以。我们看一些应用:

练习: 利用乘法公式求ΔkHk\Delta kH_k,其中HkH_k是前kk个调合数的和。

容易发现:

ΔkHk=kΔHk+Hk+1Δk=kk+1+Hk+1

\Delta kH_k = k\Delta H_k+H_{k+1}\Delta k = \frac k {k+1}+H_{k+1}

和从定义出发得到了相同的结果。


这个公式真正有用的地方是推出了广为称道的“分部求和法”,求公式两边求不定和式并整理得到:

∑uΔv=uv−∑EvΔu

\sum u\Delta v=uv-\sum Ev\Delta u

这个公式大大拓展了求和的范围。对于两个式子的乘积,先求一个的不定和式,再用公式展开求另一个(特别是负指数阶乘幂时不定和式会降低幂次)。用一个例子来解释:

例题

f(n)=∑0≤k<nHk(k+1)(k+2)

f(n) = \sum_{0\le k

的封闭形式。

利用裂项转化:

f(n)=∑0≤k<nHk(1k+1−1k+2)

f(n) = \sum_{0\le k

注意到(Δ2\Delta^2表示二阶差分,正如D2D^2表示二阶导数):

−Δ2(Hk)=1k+1−1k+2

-\Delta^2(H_k) = \frac 1 {k+1}-\frac 1 {k+2}

则只要求不定和式

−∑HkΔ2(Hk)

-\sum H_k \Delta^2(H_k)

利用分部求和公式:

−(HkΔHk−∑Δ(Hk+1)Δ(Hk))

-(H_k\Delta H_k-\sum \Delta(H_{k+1})\Delta(H_k))

化简后得到

−(Hkk+1−∑1(k+1)(k+2))

-\left(\frac {H_k} {k+1}-\sum \frac 1 {(k+1)(k+2)}\right)

用阶乘幂表示并化简

−Hk+1k+1

-\frac {H_k+1} {k+1}

根据有限微积分基本定理:

f(n)=g(n)−g(0)=k−Hkk+1

f(n) = g(n)-g(0) = \frac {k-H_k} {k+1}

在后面对二项式恒等式的处理中,也可以看到有限微积分的强大威力。

二、 二项恒等式

基本定义


二项式系数是最常用的组合数,(nk){n\choose k}表示从n个物品中取出k个的方案数。他的代数定义则更加直接:

(rk)=rk−k!

{r\choose k} = \frac {r^\underline k} {k!}

特别指出,如果k<0k,有(rk)=0{r\choose k} = 0。

二项恒等式


下面是十个最重要的二项恒等式。

  1. 展开式:

    (nk)=n!k!(n−k)!

    {n\choose k} = \frac {n!} {k!(n-k)!}

  2. 对称恒等式:
    (nk)=(nn−k)

    {n\choose k} = {n\choose n-k}

  3. 吸收/提取恒等式:
    (rk)=rk(r−1k−1),k≠0

    {r\choose k} = \frac r k{r-1 \choose k-1}, k\ne 0

  4. 归纳恒等式:
    (rk)=(r−1k)+(r−1k−1)

    {r\choose k} = {r-1\choose k}+{r-1\choose k-1}

  5. 上指标反转:
    (rk)=(−1)k(k−r−1k)

    {r\choose k} = (-1)^k{k-r-1\choose k}

  6. 三项式版恒等式:
    (rm)(mk)=(rk)(r−km−k)

    {r\choose m}{m\choose k} = {r\choose k}{r-k\choose m-k}

  7. 二项式定理:
    (x+y)n=∑0≤k≤n(nk)xkyn−k

    (x+y)^n = \sum_{0\le k\le n}{n\choose k}x^ky^{n-k}

  8. 平行求和法:
    ∑k≤n(r+kk)=(r+n+1n)

    \sum_{k\le n}{r+k\choose k} = {r+n+1\choose n}

  9. 上指标求和:
    ∑k≤n(km)=(n+1m+1),m,n≥0

    \sum_{k\le n}{k\choose m} = {n+1\choose m+1}, m,n\ge 0

  10. 范德蒙德卷积公式
    ∑k(rk)(sn−k)=(r+sn)

    \sum_k{r\choose k}{s\choose n-k} = {r+s\choose n}

有限微积分证明二项恒等式

如果我们发现了一个不是很好处理的二项式,却又恰巧忘记了对应的恒等式,那么处理就变的棘手了。幸而我们有有限微积分的强大武器。

例题

不用归纳法,证明上指标求和法:

∑0≤k≤n(km)=(n+1m+1)(∗)

\sum_{0\le k\le n}{k\choose m} = {n+1\choose m+1}(*)

解:设f(x)=∑(km)δkf(x) = \sum {k\choose m}\delta k,有

(∗)=f(n+1)−f(0)

(*) = f(n+1)-f(0)

而根据有限微积分:

∑(km)δk=∑km−−m!δk=1m!1m+1km+1=1(m+1)!km+1=(km+1)

\sum {k\choose m} \delta k = \sum \frac {k^\underline m} {m!} \delta k\\=\frac 1 {m!}\frac 1 {m+1}k^{m+1}\\ = \frac 1 {(m+1)!}k^{m+1}\\ = {k\choose m+1}

(∗)=f(n+1)−f(0)=(n+1m+1)

(*) = f(n+1)-f(0) = {n+1\choose m+1}

一个陷阱: 和微积分一样,要注意常量和变量的区别,否则将得出错误的答案。

利用标准技术求解惊悚的和式


例题:

这是一个实际问题:求

S=∑0≤k≤nk(m−k−1m−n−1)

S = \sum_{0\le k\le n}k{m-k-1\choose m-n-1}

的封闭形式。

解:考虑两个东西乘积的和,首先考虑用吸收恒等式将其合并,而方法就是凑出上指标。不难发现:

S=∑0≤k≤n(m−(m−k))(m−k−1m−n−1)

S = \sum_{0\le k\le n}(m-(m-k)){m-k-1\choose m-n-1}

展开并整理,得到:

S=∑0≤k≤nm(m−k−1m−n−1)−∑0≤k≤n(m−k)(m−k−1m−n−1)

S = \sum_{0\le k\le n}m{m-k-1\choose m-n-1}-\sum_{0\le k\le n}(m-k){m-k-1\choose m-n-1}

前后分别处理,第一个和式考虑用上指标求和,替换枚举变量k→m−k−1k\rightarrow m-k-1以便在上面得到简单的形式:

u=m∑0≤m−k−1≤n(km−n−1)

u = m\sum_{0\le m-k-1\le n}{k\choose m-n-1}

化简得到:

u=m∑m−n−1≤k≤m−1(km−n−1)

u = m\sum_{m-n-1\le k\le m-1}{k\choose m-n-1}

这次可以动用上指标求和法:

u=m(mm−n)

u = m{m\choose m-n}

这时在考虑第二部分,用吸收恒等式化简之,得到:

v=(m−n)∑0≤k≤n(m−km−n)

v = (m-n)\sum_{0\le k\le n}{m-k\choose m-n}

仍然仿照上面的处理,得到:

v=(m−n)(m+1m−n+1)=(m−n)(m+1)m−n+1(mm−n)

v = (m-n){m+1\choose m-n+1} = \frac {(m-n)(m+1)}{m-n+1}{m\choose m-n}

S=u−v=m(m−n+1)−(m−n)(m+1)m−n+1(mm−n)=nm−n+1(mn)

S = u-v = \frac {m(m-n+1)-(m-n)(m+1)}{m-n+1}{m\choose m-n}\\ = \frac n {m-n+1}{m\choose n}

二项式反演


有时候一个问题是难于求解的,但其容斥的结果是便于求解的,也就是说,待求解的函数g(n)g(n)和一个简单的函数f(n)f(n)构成:

f(n)=∑0≤k≤n(−1)k(nk)g(k)

f(n) = \sum_{0\le k\le n}(-1)^k {n\choose k}g(k)

的关系,就可以用解方程的手段在O(n3)O(n^3)求得g(n)g(n)。但反演定理允许我们在O(n)O(n)的时间内解决这一问题(不包含预处理组合数),即:

g(n)=∑0≤k≤n(−1)k(nk)f(k)

g(n) = \sum_{0\le k\le n}(-1)^k {n\choose k}f(k)

这个公式前后完全对称,既具有美感又便于记忆。下面我们考虑用已有的知识证明之。

证明反演定理

注意:在证明中我们更关心细节和过程,以便在遇到更复杂的问题时尽快找到突破口。

f(n)=∑0≤k≤n(−1)k(nk)g(k)⟺g(n)=∑0≤k≤n(−1)k(nk)f(k)

f(n) = \sum_{0\le k\le n}(-1)^k {n\choose k}g(k)\iff g(n) = \sum_{0\le k\le n}(-1)^k {n\choose k}f(k)

由于定理左右对称,只需要证明⇒\Rightarrow即可。根据定义,右边=

∑0≤i≤n(−1)i(ni)∑0≤j≤i(−1)j(ij)g(j)

\sum_{0\le i\le n}(-1)^i{n\choose i}\sum_{0\le j\le i}(-1)^j{i\choose j}g(j)

整理:

∑0≤i≤n∑0≤i≤j(−1)i+j(ni)(ij)g(j)

\sum_{0\le i\le n}\sum_{0\le i\le j}(-1)^{i+j}{n\choose i}{i\choose j}g(j)

我们不希望一个未知的g(n)g(n)深入在和式中,而希望将他提出内层和式,从而用已有知识处理后面的部分,运用三项式版恒等式,并交换求和次序,提公因式后得到:

∑0≤j≤n(nj)g(j)∑j≤i≤n(−1)i+j(n−ji−j)(∗)

\sum_{0\le j\le n}{n\choose j}g(j)\sum_{j\le i\le n}(-1)^{i+j}{n-j\choose i-j}(*)

这时后面的部分就独立出来了,我们只需要处理后半部分。我们希望二项式下边尽可能简单,以便使用平行求和法。替换循环变量i→i−ji\rightarrow i-j,并化简后得到:

∑0≤i≤n−j(−1)i+2j(n−ji)

\sum_{0\le i\le n-j}(-1)^{i+2j}{n-j\choose i}

为了处理讨厌的(−1)i+2j(-1)^{i+2j},应该提出一个(−1)i(-1)^i来消去之,对内部翻转上指标:

∑0≤i≤n−j(−1)2i+2j(i−(n−j)−1i)

\sum_{0\le i\le n-j}(-1)^{2i+2j}{i-(n-j)-1\choose i}

整理得到:

∑0≤i≤n−j(i+(−n+j−1)i)

\sum_{0\le i\le n-j}{i+(-n+j-1)\choose i}

终于发现了熟悉的平行求和法的形式,这一项的结果可以立即书写出,就是:

(jn)=[j=n]

{j\choose n} = [j=n]

即当且仅当j=nj=n时,该式为1,则原式:

(∗)=∑0≤j≤n(nj)g(j)[j=n]=g(n)

(*) = \sum_{0\le j\le n}{n\choose j}g(j)[j=n] = g(n)

因此原命题成立。

错排公式——二项式反演的应用


考虑一个问题:n个人将帽子高高扔起,并捡起一个帽子,问每个人都不拿到自己帽子的情况有多少种。

这个问题等价于问不存在长度为1的循环的置换总数的计数。一种方便的解决方案是:设f(n)f(n)为nn个帽子的情况总数,则有递推式:

f(n)=(n−1)(f(n−1)+f(n−2))

f(n) = (n-1)(f(n-1)+f(n-2))

这个递推式很容易找到一个组合解释,但这不在本文讨论的范畴。现在我们要用二项式反演的技术来解决这个问题,设f(n)f(n)为nn排列的总数,显然为f(n)=n!f(n) = n!;设g(n)g(n)为nn错排公式。记K(i)K(i)为“至少有i个错排的排列方案数”,则根据定义有

K(i)=(ni)g(i)×(n−i)!

K(i)={n\choose i}g(i)\times (n-i)!

由于“至少有nn个”被“至少有n−1n-1个”真包含,因此要用容斥原理。“至少有0个”包含一切,之后符号交替出现,即:

f(n)=∑0≤k≤n(−1)kK(k)

f(n) = \sum_{0\le k\le n}(-1)^kK(k)

整理后也就是:

f(n)=∑0≤k≤n(−1)k(nk)g(k)(n−i)!

f(n) = \sum_{0\le k\le n}(-1)^k{n\choose k}g(k)(n-i)!

这可以用反演定理变化为:

g(n)(n−n)!=∑0≤k≤n(−1)k(nk)f(k)

g(n)(n-n)! = \sum_{0\le k\le n}(-1)^k{n\choose k}f(k)

也就是:

g(n)=∑0≤k≤n(−1)k(nk)k!

g(n) = \sum_{0\le k\le n} (-1)^k{n\choose k}k!

经过检验,这个方程和上面的递推式在初始的几项有相同的结果。我们大概可以相信获得了一个正确的答案。

高阶差分法


当我们已经知道一个数列符合一个多项式,或者组合数时,如何快速求出数列的通项公式?一个方法是所谓“拉格朗日插值法”,但我们也可以用有限微积分和组合数的武器解决。回忆分析中的泰勒级数:

g(a+x)=∑k≥0Dkg(a)k!xk

g(a+x) = \sum_{k\ge 0}\frac {D^kg(a)} {k!}x^k

应该可以想到有限微积分也有类似的公式“牛顿级数”,形式和泰勒级数相同:

g(a+x)=∑k≥0Δkg(a)k!xk−

g(a+x) = \sum_{k\ge 0}\frac {\Delta^kg(a)}{k!}x^\underline k

为了便于计算取a=0a = 0,根据组合数的定义也就是:

g(x)=∑k≥0Δkg(0)(xk)

g(x) = \sum_{k\ge 0}\Delta^kg(0){x \choose k}

还记得物理必修一中的“逐差法”测加速度吗?其深层次的数学原理就在于此。用一个小情景来验证这个定理:

y=f(x)=x3+2x2+x+4

y = f(x) = x^3+2x^2+x+4

取值如下表所示:

x 0 1 2 3 4 5 6
y = f(x) 4 8 22 52 104 184 298
Δ0f(0)=4Δ1f(0)=4Δ2f(0)=10Δ3f(0)=6Δ4f(0)=0

\Delta^0 f(0) = 4\\ \Delta^1 f(0) = 4 \\ \Delta^2 f(0) = 10\\ \Delta^3 f(0) = 6\\ \Delta^4 f(0) = 0

根据公式:

f(x)=4(x0)+4(x1)+10(x2)+6(x3)=x3+2x2+x+4

f(x) = 4{x\choose 0}+4{x\choose 1}+10{x\choose 2}+6{x\choose 3}\\ = x^3+2x^2+x+4

这个方法的一个好处是:一旦通过O(n2)O(n^2)的时间知道了组合数前的系数,由于同一行的组合数可以根据下式线性递推求得,可以在O(n)O(n)时间内求出f(x)f(x)的值。

(nm)=(n−1m)+(n−1m−1)=m+1n(nm+1)+mn(nm)

{n\choose m} = {n-1\choose m}+{n-1\choose m-1} \\ = \frac{m+1} n{n\choose m+1}+\frac m n{n\choose m}

即:

(nm)=m+1n−m(nm+1)

{n\choose m} =\frac {m+1} {n-m}{n\choose m+1}

生成函数


在多项式系数中蕴含组合性质是有理由的,因为“多项式乘法”由于二项式定理被赋予了组合性质。更重要的是,两个n次多项式相乘只需要O(nlgn)O(n\lg n)的时间复杂度。正式的,一个数列⟨a0,a1,a2,…⟩\left的生成函数A(x)A(x)为:

A(x) = \sum_{k\ge 0} a_kx^k

生成函数的简单运用可以分为:

  1. 利用运算证明恒等式
  2. 利用封闭形式求解组合问题
  3. 利用多项式乘法(卷积)处理组合问题

证明恒等式

考虑之前的范德蒙德卷积公式:

∑k(rk)(sn−k)=(r+sn)

\sum_k{r\choose k}{s\choose n-k} = {r+s\choose n}

每当出现k,n−kk, n-k或k,k−nk, k-n出现时要考虑卷积。

考虑(1+x)r(1+x)^r和(1+x)s(1+x)^s所表达的生成函数:

∑0≤k≤r(rk)xk∑0≤k≤s(sk)xk

\sum_{0\le k\le r}{r\choose k}x^k\\ \sum_{0\le k\le s}{s\choose k}x^k

两式分别相乘,取次数为nn的系数,得到:

∑k(rk)(sn−k)=(r+sn)

\sum_k{r\choose k}{s\choose n-k} = {r+s\choose n}

就是原来的公式。

利用封闭形式解决问题


如果一个生成函数可以被表示成封闭形式,那当然可以为我们解决许多问题。考虑数列⟨1,1,1,1,…⟩\left的生成函数,设其为TT,满足:

T=1+xT

T = 1+xT

解得:T=11−xT = \frac 1 {1-x}

而数列⟨1,2,3,4,5,…⟩\left,可以通过这个公式两边求导并得到,就是:

∑k≥0kxk−1=1(1−x)2

\sum_{k\ge 0} kx^{k-1} = \frac 1 {(1-x)^2}

另一个常用的数列⟨1,−1,1,−1,1,−1,…⟩\left,他的生成函数是:

T=1−xT

T = 1-xT

解得T=11+xT = \frac 1 {1+x}。

考虑只包含nn的倍数的数列的生成函数,即

∑k≥0[k=np,p∈n]xk

\sum_{k\ge 0}[k=np,p\in n]x^k

容易发现

T=1+xnT

T = 1+x^nT

解得:T=11−xnT = \frac 1 {1-x^n}

如果一个数列为二项式系数的一行,即⟨(n0),(n1),(n2)…⟩\left,根据二项式定理,其生成函数为:(1+x)n(1+x)^n。

封闭形式的乘积恰好表示了所代表序列的卷积,这是个很好的性质,有时候将帮助我们寻找问题的答案。仍然用那个经典的例题做解释:

例题: 我们要从苹果、香蕉、橘子和梨中拿一些水果出来,要求苹果只能拿偶数个,香蕉的个数要是5的倍数,橘子最多拿4个,梨要么不拿,要么只能拿一个。问按这样的要求拿n个水果的方案数。

解:分别用生成函数表示所有情景:

1+x2+x4+⋯=11−x21+x5+x10+⋯=11−x51+x+x2+x3+x4=1−x51−x1+x

1+x^2+x^4+\dots = \frac 1 {1-x^2}\\ 1+x^5+x^{10}+\dots = \frac 1 {1-x^5}\\ 1+x+x^2+x^3+x^4 = \frac {1-x^5} {1-x}\\ 1+x

将他们全部乘起来,得到:

1+x1−x−x2+x3

\frac {1+x} {1-x-x^2+x^3}

由于我们坚信出题人是仁慈的,这个分式一定可以化简。用长除法可以得出:

1(1−x)2=1+2x+3x3+…

\frac 1 {(1-x)^2} = 1+2x+3x^3+\dots

这样答案就有了,取nn个的方案是n+1n+1。

完了

参(zhao)考(ban)资(lai)料(yuan)

  • 《具体数学》
  • 《组合数学》

数学知识:和式的处理及二项式系数的运用相关推荐

  1. 高三女生因高中数学知识的数列解题技巧没掌握与梦想大学失之交臂

    高三女生因高中数学知识的数列解题技巧没掌握与梦想大学失之交臂 一漂亮高三女生在走出考场的那一刻已是泪流满面,问其原因竟是高考数学考试有关数列的考题没有能够做对,估计考分达不到自己理想大学的要求,其实高 ...

  2. 熬了几个通宵,终于把初中到大学的数学知识梳理完了(学习算法必备数学知识)

    作者简介:阿里巴巴高级技术专家,一直关注前端和机器学习邻域相关技术,在知乎和微信公众号的"全栈深入"分享深度硬核技术文章. 下面的基础数学知识涉及很多数学公式,这些公式编辑起来累S ...

  3. 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)

    通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...

  4. 入门深度学习的必备数学知识

    作者:徐洲更 中科院在读遗传学博士.出于对计算机科学的兴趣,蜻蜓点水式自学了大量编程相关知识,现在对深度学习很感兴趣,正在恶补相关知识.此外,还负责帮忙管理生信媛,一个热衷于分享生物信息学知识的公众号 ...

  5. 机器学习、深度学习所需掌握的数学知识全都在这里了!

    人工智能的基石是数学,没有数学基础科学的支持,人工智能很难行稳至远. -中国科学院院士.西安交通大学教授徐宗 [文末高薪招聘讲师!!!] 入行人工智能,所谓的门槛和挑战本质是你对数学知识的掌握程度. ...

  6. 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?

    https://www.toutiao.com/a6661754579887063566/ 根据<人工智能影响力报告>显示: 人工智能科学家主要毕业于清华大学.中国科学院.中国科技大学.麻 ...

  7. 关于一部分数学知识》(工具向)(实时更新)

    这里汇总一下关于联赛的一些数学知识,以后做到有些关于数学的题就可以较快的解决(和愉快的装13). 1.组合数 这个应该是高中数学就学过的知识,在这里详细的介绍就不给出了,可以自行百度. 公式一: 这个 ...

  8. 机器学习中的基本数学知识

    注:本文的代码是使用Python 3写的. 机器学习中的基本数学知识 线性代数(linear algebra) 第一公式 矩阵的操作 换位(transpose) 矩阵乘法 矩阵的各种乘积 内积 外积 ...

  9. 学习AI可能不需要那么多数学知识:20小时进阶计划

    这里还有一个关于AI不为人知的小秘密: 事实上你不需要储备那么多的数学知识才能开始使用AI. 如果你是一名开发人员或系统管理员,你可能早已使用了很多你所了解的库和框架.为了使用curl(一个广泛使用的 ...

最新文章

  1. 校招9.28笔试题:1-N 的幂集中集合个数 去除含相邻数字的集合
  2. 拥抱 Node.js 8.0,N-API 入门极简例子
  3. 最新全球自由职业技能单日排行
  4. 多元有序logistic回归_医学统计与R语言:多分类logistic回归HosmerLemeshow拟合优度检验...
  5. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub
  6. 如何判断是linux/windows库,module或程序debug还是release(转)
  7. python opencv2_Python + OpenCV2 系列:2 - 图片操作
  8. 浅析Lambda 表达式
  9. Codeforces-GYM101873 G Water Testing 皮克定理
  10. 域名被封(微信)后的思索
  11. Android实战开发--三种地图类型的设计
  12. 发布谷歌离线地图瓦片
  13. 数商云跨境电商供应链平台方案,提供全链条的跨境供应链服务
  14. 新西兰皇后镇-我眼中的西施
  15. Educational Codeforces Round 61 (Rated for Div. 2) D. Stressful Training 详解
  16. 在HTML中实现两个div并排显示
  17. 鲸会务一站式智能会议系统帮助主办方实现数字化会议管理
  18. 理不清薪酬,更心愁 穆穆-movno1
  19. 丰润二中2021高考成绩查询,2021年唐山中考成绩查询
  20. ccm linux中安装教程,StarCCM+ V5.02.009安装指南(PC Linux 32)

热门文章

  1. 夺命雷公狗---DEDECMS----27dedecms电影的下载地址的完成
  2. HEC-HMS水文模型应用教程
  3. 深度系统安装php,如何在原有系统中加入功能 深度系统 安装系统 系统还
  4. qt 保存绘制图片时背景变黑_QGraphicsScene绘制背景图片引起的问题
  5. 【OJ每日一练】1022 - 梯形的面积
  6. 【mmdetection系列】mmdetection之evaluate评测
  7. 日记:目前的形式与分析-往事不可谏,来者犹可追
  8. 程序人生之真正女程序员是什么样的
  9. Cesium光柱椎体
  10. Nd2d引擎学习笔记