1780 字
9 分钟
形式幂级数1-计数问题的多项式视角

形式幂级数1-计数问题的多项式视角#

概要#

某些计数计算可以和对多项式、形式幂级数的计算联系起来。本文将会通过一些例题说明如何构建计数问题的多项式视角,但不会说明具体的求解方法。

概念引入#

例1

给定集合 A={2,3}A=\{2,3\}B={2,4}B=\{2,4\}C={3,5,7}C=\{3,5,7\}。从每个集合中各选 11 个元素 a,b,ca,b,c。有多少种选法能使得 a+b+c=na+b+c=n

题解

解:[xn](x2+x3)(x2+x4)(x3+x5+x7)[x^{n}](x^{2}+x^{3})(x^{2}+x^{4})(x^{3}+x^{5}+x^{7})

nn 次项系数#

对于例1,设多项式 f=(x2+x3)(x2+x4)(x3+x5+x7)f=(x^{2}+x^{3})(x^{2}+x^{4})(x^{3}+x^{5}+x^{7}),则 [xn]f[x^n]f 表示 ffxnx^{n} 的系数,这个符号将在后文中高频出现,不再赘述。

基于分配律的解释#

一般来说,计算 (a1+a2+)(b1+b2+)(c1+c2+)(a_{1}+a_{2}+\cdots)(b_{1}+b_{2}+\cdots)(c_{1}+c_{2}+\cdots) 这样的乘积时,结果就是把所有形如 aibjcka_{i}b_{j}c_{k} 的乘积各加一次。本题中:

  • 选择 x2x^{2}x3x^{3}
  • 选择 x2x^{2}x4x^{4}
  • 选择 x3x^{3}x5x^{5}x7x^{7}
  • 把选到的项的乘积全部加起来

这样就能算出 f=(x2+x3)(x2+x4)(x3+x5+x7)f=(x^{2}+x^{3})(x^{2}+x^{4})(x^{3}+x^{5}+x^{7})。若选择的项分别是 xa,xb,xcx^{a},x^{b},x^{c},那么它们的乘积就是 xa+b+cx^{a+b+c}。因此 [xn]f[x^{n}]f 与满足 a+b+c=na+b+c=n(a,b,c)(a,b,c) 的选法总数一致。

基于状态转移的解释#

当我们对每个状态都计算了某个值时,可以把计算结果保存成一个多项式。原则上让“多项式的次数”表示“正在考虑的状态”,让“系数”表示该状态上的“计算出的值”(多数情况下是计数结果)。

简单地说,ff 等价于 dp[]dp[][xn]f[x^n]f 等价于 dp[n]dp[n]

在例1中,我们把“和的数值”作为状态(多项式幂次),把“能用多少种方式得到这个和”作为值(多项式系数),来更新多项式。

  • 什么都还没选的状态 \to 11,或者说 1x01\cdot x^0
  • 选择集合 AA 的元素 \to x2+x3x^{2}+x^{3}(可以理解为和为2或3的情况都只有一种,即 dp[2]=dp[3]=1dp[2]=dp[3]=1,这里 dp[i]dp[i] 表示和为 ii 的选法数量)
  • 再选择集合 BB 的元素 \to ???(这里是问题)
    • BB 中选 22\to (x2+x3)x2(x^{2}+x^{3})x^{2}
    • BB 中选 44\to (x2+x3)x4(x^{2}+x^{3})x^{4}
    • 合起来 \to (x2+x3)(x2+x4)(x^{2}+x^{3})(x^{2}+x^{4})

BB 中选择元素,等价于有“把当前状态 +2+2”和“把当前状态 +4+4”的两个选项。像这样,把所有状态同时平移一个常数的操作,可以表示为乘上 xnx^{n}。于是我们可以用多项式乘法表示状态转移,然后让我们继续推导,

  • 假设选完集合 BB 时,已经得到多项式 gg
  • 继续选择集合 CC 的元素
    • CC 中选 33gx3gx^{3}
    • CC 中选 55gx5gx^{5}
    • CC 中选 77gx7gx^{7}
    • 合起来 → g(x3+x5+x7)g(x^{3}+x^{5}+x^{7})

可以看到,选一个元素这件事就变成了乘上某个多项式的操作。什么都还没选的状态是 11,经过从 A,B,CA,B,C 中的选择之后,最终得到多项式 f=(x2+x3)(x2+x4)(x3+x5+x7)f=(x^{2}+x^{3})(x^{2}+x^{4})(x^{3}+x^{5}+x^{7})

更多的例题#

一维问题#

例2

22 个苹果、33 个橘子、44 个葡萄出售。一共买 nn 个水果的方法有多少种?(同种水果之间不区分)

题解

解:[xn](1+x+x2)(1+x+x2+x3)(1+x+x2+x3+x4)[x^{n}](1+x+x^{2})(1+x+x^{2}+x^{3})(1+x+x^{2}+x^{3}+x^{4})

例3

苹果、橘子、葡萄都有无限多个出售。一共买 nn 个的方法有多少种?(同种水果之间不区分)

题解

解:令 f=n=0xn=1+x+x2+x3+x4+x5+f=\sum_{n=0}^{\infty}x^{n}=1+x+x^{2}+x^{3}+x^{4}+x^{5}+\cdots(无限继续),则答案是 [xn]f3[x^{n}]f^{3}。在算法题中,nn 往往是一个有限数值,在算法实现时我们一般只需要保存 nn 次幂以内的系数。

例4

有重量为 w1w_{1} 的物品、重量为 w2w_{2} 的物品、……、重量为 wkw_{k} 的物品各 11 个。装进承重 WW 的包中有多少种方法?(忽略装入顺序;也可以一个都不选)

题解

解:n=0W[xn]i=1k(1+xwi)\sum_{n=0}^{W}[x^{n}]\prod_{i=1}^{k}(1+x^{w_{i}})

例5

N,MN,M 为正整数。统计满足如下条件的整数列 A1,,ANA_{1},\ldots,A_{N} 数量:

  • 0<A1A2AN=M0<A_{1}\leq A_{2}\leq\cdots\leq A_{N}=M
  • 对任意 1iN11\leq i\leq N-1,都有 3Ai+1Ai53\leq A_{i+1}-A_{i}\leq 5
题解

解:令 f=n=1xn,g=x3+x4+x5f=\sum_{n=1}^{\infty}x^n, g=x^{3}+x^{4}+x^{5},则答案是 [xM]fgN1[x^M]f\cdot g^{N-1}

这里多项式 ff 是状态转移的初始状态(用于表示 A1A_1 的状态),gg 则表示状态转移(每一步可能 +3,+4,+5+3,+4,+5),因为 AN=MA_N=M,所以最后只需要取出 MM 次项的系数。

例6

N,MN,M 为正整数。统计满足如下条件的整数列 A1,,ANA_{1},\ldots,A_{N} 数量:

  • 0<A1A2AN<M0<A_{1}\leq A_{2}\leq\cdots\leq A_{N}<M
  • 对任意 1iN11\leq i\leq N-1,都有 3Ai+1Ai53\leq A_{i+1}-A_{i}\leq 5
题解

解:这题与例5高度相似,有两种思路可以解决:

  1. m=1M1[xm]fgN1\sum_{m=1}^{M-1}[x^m]f\cdot g^{N-1}。也就是根据最终状态分类统计。
  2. [xM]fgN1f[x^M]f\cdot g^{N-1}\cdot f。因为 AN<MA_N\lt M,所以我们可以补一个条件 AN+1=M,AN+1AN>0A_{N+1}=M,A_{N+1}-A_N\gt 0
例7

投掷标准骰子 100100 次。求点数之和为 nn概率

题解

解:令 f=16(x+x2+x3+x4+x5+x6)f=\frac{1}{6}(x+x^{2}+x^{3}+x^{4}+x^{5}+x^{6}),则答案是 [xn]f100[x^{n}]f^{100}

这里构造了一个以每个“状态”的“概率”为系数的多项式。可以把它理解为:让状态 +1,+2,,+6+1,+2,\ldots,+6 的方式各有 1/61/6 个。

例8

实数 p,qp,q 满足 p+q=1p+q=1。一开始位于数轴原点,每次投掷一枚“正面概率为 pp、反面概率为 qq 的硬币”,若为正面就向正方向走 11 步,若为反面就向负方向走 11 步。投掷硬币 100100 次后,位于 x=nx=n 的概率是多少?

题解

解:令 f=(px+qx1)f=(px+qx^{-1}),则答案是 [xn]f100[x^{n}]f^{100}

在编程实现时,负下标不好处理,因此可以添加一个偏移量:[xn+100]x100(px+qx1)100[x^{n+100}]x^{100}(px+qx^{-1})^{100}。因此也等于 [xn+100](px2+q)100[x^{n+100}](px^{2}+q)^{100}。这样,计算对象中就消除了负次幂项。

例9

考虑把正整数 NN 表示为 N=a1+a2++akN=a_{1}+a_{2}+\cdots+a_{k}(其中 aia_{i} 为正整数)的形式(要区分不同顺序)。对这样的分割,把它的“美丽度”定义为 i=1kai2\prod_{i=1}^{k}a_{i}^{2}。求所有分割的“美丽度”之和。

题解

解:令 f=k=1k2xk=x+4x2+9x4+f=\sum_{k=1}^{\infty}k^2x^k = x + 4x^2 + 9x^4+\cdots,则答案是 [xN]n=0fn[x^N]\sum_{n=0}^{\infty}f^n

这是一个较难的例子,虽然仍然是构造一个对每个“状态”保存“值”的多项式,但这里让值保存的是“美丽度之和”。第 nn 次转移中,如果把“状态”推进 kk,那么“值”会变为原来的 k2k^{2} 倍,所以得到这种形式。

高维问题#

高维问题中多项式往往很难高速计算,除非具有很好的结构。

例10

有如下商品:

  • 商品 A:价格 33 元,重量 44
  • 商品 B:价格 55 元,重量 66

每种最多可以买 22 个。正好花 nn 元、重量为 mm 克的方法有多少种?

题解

解:令 f=1+x3y4+x6y8f=1+x^{3}y^{4}+x^{6}y^{8}g=1+x5y6+x10y12g=1+x^{5}y^{6}+x^{10}y^{12},则答案是 [xnym]fg[x^{n}y^{m}]fg

例11

有无限多枚 11 元、55 元、1010 元硬币。正好使用 nn 枚并正好支付 mm 元的方法数是多少?

题解

解:令 f1=n=0xnynf_{1}=\sum_{n=0}^{\infty}x^{n}y^{n}f5=n=0x5nynf_{5}=\sum_{n=0}^{\infty}x^{5n}y^{n}f10=n=0x10nynf_{10}=\sum_{n=0}^{\infty}x^{10n}y^{n},则答案是 [xmyn]f1f5f10[x^{m}y^{n}]f_{1}f_{5}f_{10}

例12

从二维坐标平面上的原点出发,进行随机游走。也就是说,当位于 (x,y)(x,y) 时,反复以相等概率移动到 (x±1,y)(x\pm1,y)(x,y±1)(x,y\pm1)。每 11 秒移动 11 次。求 TT 秒后位于 (a,b)(a,b) 的概率。

题解

解:令 f=(x+x1+y+y1)/4f=(x+x^{-1}+y+y^{-1})/4,则答案是 [xayb]fT[x^{a}y^{b}]f^{T}

bonus:https://www.zhihu.com/question/310998719/answer/593071401。

例13

33 个变量 X,Y,ZX,Y,Z,初始时它们的值全都是 00。一次操作中,可以做以下任意一种:

  • 选择 11 个变量,加上 111-1
  • 给所有变量同时加上 11,或同时加上 1-1

NN 次操作后,满足 X=pX=pY=qY=qZ=rZ=r 的操作序列有多少种?

题解

f=x+x1+y+y1+z+z1+xyz+(xyz)1f=x+x^{-1}+y+y^{-1}+z+z^{-1}+xyz+(xyz)^{-1},则答案是 [xpyqzr]fN[x^{p}y^{q}z^{r}]f^{N}

形式幂级数1-计数问题的多项式视角
https://fuwari.vercel.app/posts/formal_power_series1/fps1/
作者
st1vdy
发布于
2026-06-07
许可协议
CC BY-NC-SA 4.0