文章目录




参考博客 :





一、使用生成函数求解多重集 r 组合数



S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , ⋯   , n k ⋅ a k } S = \{ n_1 \cdot a_1, n_2 \cdot a_2, \cdots, n_k \cdot a_k \} S={n1⋅a1,n2⋅a2,⋯,nk⋅ak} 是多重集 , 其含有 k k k 个种类的元素 , n 1 , n 2 , ⋯   , n k n_1, n_2, \cdots, n_k n1,n2,⋯,nk 是每种元素的重复度 ,

该 多重集的 r r r 组合数 , 是 不定方程 x 1 + x 2 + ⋯ + x k = r x_1 + x_2 + \cdots + x_k = r x1+x2+⋯+xk=r 的非负整数解 , 前提是 x i ≤ n i x_i \leq n_i xi≤ni , 每个元素所取的个数 x i x_i xi , 不能超过其重复度 n i n_i ni ;

相当于 a 1 a_1 a1 取 x 1 x_1 x1 个 , a 2 a_2 a2 取 x 2 x_2 x2 个 , ⋯ \cdots ⋯ , a k a_k ak 取 x k x_k xk 个 , 总共取 r r r 个 ;

n i n_i ni 是无穷个数时 , 多重集的 r r r 组合数是 C ( k + r − 1 , r ) C(k + r - 1, r) C(k+r−1,r)



回顾多重集排列组合 :


  • 可重复的元素 , 有序的选取 , 对应 ​多重集的排列​ ; 全 排 列 = n ! n 1 ! n 2 ! ⋯ n k ! 全排列 = \cfrac{n!}{n_1! n_2! \cdots n_k!} 全排列=n1!n2!⋯nk!n! , 非全排列 k r ,    r ≤ n i k^r , \ \ r\leq n_i kr,  r≤ni
  • 可重复的元素 , 无序的选取 , 对应 ​多重集的组合​ ; N = C ( k + r − 1 , r ) N= C(k + r - 1, r) N=C(k+r−1,r)


上述的 多重集 r r r 组合数 C ( k + r − 1 , r ) C(k + r - 1, r) C(k+r−1,r) 是在重复度不受限制的情况下的选取结果 , 如果重复度受限制 , 就需要使用生成函数进行计算 ;

如添加如下限制 : a 1 a_1 a1 最多能取 3 3 3 个 , a 2 a_2 a2 最少取 4 4 4 个 , 最多取 10 10 10 个 ;



生成函数 :

G ( y ) = G(y) = G(y)= ( 1 + y + ⋯ + y n 1 ) (1 + y + \cdots + y^{n_1}) (1+y+⋯+yn1) ( 1 + y + ⋯ + y n 2 ) (1 + y + \cdots + y^{n_2}) (1+y+⋯+yn2) ⋯ \cdots ⋯ ( 1 + y + ⋯ + y n k ) (1 + y + \cdots + y^{n_k}) (1+y+⋯+ynk)

多重集中的每个元素的取值个数作为 y y y 的次幂 , 如 a 1 a_1 a1 元素的取值个数是 0 0 0 到 n 1 n_1 n1 , 则该项对应的 生成函数项是 从 y y y 的 0 0 0 次幂 , 到 y y y 的 n 1 n_1 n1 次幂 相加 ; 构成项 ( 1 + y + ⋯ + y n 1 ) (1 + y + \cdots + y^{n_1}) (1+y+⋯+yn1) ;

将所有元素的上述 生成函数项 乘到一起 , 就构成上述生成函数 ;



按照多项式乘法 , 多重集中取 r r r 个元素 ,

从第一个因式 ( 1 + y + ⋯ + y n 1 ) (1 + y + \cdots + y^{n_1}) (1+y+⋯+yn1) 拿出 y x 1 y^{x_1} yx1 ,

从第二个因式 ( 1 + y + ⋯ + y n 2 ) (1 + y + \cdots + y^{n_2}) (1+y+⋯+yn2) 拿出 y x 2 y^{x_2} yx2 ,

⋮ \vdots ⋮

从第 k k k 个因式 ( 1 + y + ⋯ + y n k ) (1 + y + \cdots + y^{n_k}) (1+y+⋯+ynk) 拿出 y x k y^{x_k} yxk ,



如果上述乘积 y x 1 y x 2 ⋯ y x k y^{x_1}y^{x_2}\cdots y^{x_k} yx1yx2⋯yxk 的结果 是 y r y^{r} yr , 即 y x 1 y x 2 ⋯ y x k = y r y^{x_1}y^{x_2}\cdots y^{x_k} = y^{r} yx1yx2⋯yxk=yr , 相当于指数 x 1 + x 2 + ⋯ + x k = r x_1 + x_2 + \cdots + x_k = r x1+x2+⋯+xk=r , 也就是不定方程的非负整数解 ;






二、使用生成函数求解多重集 r 组合数 示例



多重集 S = { 3 ⋅ a , 4 ⋅ b , 5 ⋅ c } S = \{3\cdot a , 4 \cdot b , 5 \cdot c \} S={3⋅a,4⋅b,5⋅c} , 求该多重集的 10 10 10 组合数 ;



上述多重集元素的 重复度 3 , 4 , 5 3,4,5 3,4,5 都不超过 10 10 10 ;

对应 a a a 元素 , 其 重复度取值范围是 0 0 0 ~ 3 3 3 , 对应的生成函数项是 y 0 + y 1 + y 2 + y 3 y^0 +y^1 + y^2 + y^3 y0+y1+y2+y3

对应 b b b 元素 , 其 重复度取值范围是 0 0 0 ~ 4 4 4 , 对应的生成函数项是 y 0 + y 1 + y 2 + y 3 + y 4 y^0 +y^1 + y^2 + y^3 + y^4 y0+y1+y2+y3+y4

对应 c c c 元素 , 其重 复度取值范围是 0 0 0 ~ 5 5 5 , 对应的生成函数项是 y 0 + y 1 + y 2 + y 3 + y 4 + y 5 y^0 +y^1 + y^2 + y^3 + y^4 + y^5 y0+y1+y2+y3+y4+y5



将上述项相乘 , 得到完整的生成函数 ;

G ( x ) = ( y 0 + y 1 + y 2 + y 3 ) ( y 0 + y 1 + y 2 + y 3 + y 4 ) ( y 0 + y 1 + y 2 + y 3 + y 4 + y 5 ) G(x) = (y^0 +y^1 + y^2 + y^3)(y^0 +y^1 + y^2 + y^3 + y^4)(y^0 +y^1 + y^2 + y^3 + y^4 + y^5) G(x)=(y0+y1+y2+y3)(y0+y1+y2+y3+y4)(y0+y1+y2+y3+y4+y5)

           = ( 1 + y 1 + y 2 + y 3 ) ( 1 + y 1 + y 2 + y 3 + y 4 ) ( 1 + y 1 + y 2 + y 3 + y 4 + y 5 ) \ \ \ \ \ \ \ \ \ \ =(1 +y^1 + y^2 + y^3)(1 +y^1 + y^2 + y^3 + y^4)(1 +y^1 + y^2 + y^3 + y^4 + y^5)           =(1+y1+y2+y3)(1+y1+y2+y3+y4)(1+y1+y2+y3+y4+y5)

           = ( 1 + 2 y 1 + 3 y 2 + 4 y 3 + 4 y 4 + 3 y 5 + 2 y 6 + y 7 ) ( 1 + y 1 + y 2 + y 3 + y 4 + y 5 ) \ \ \ \ \ \ \ \ \ \ =(1 +2y^1 + 3y^2 + 4y^3 + 4y^4 + 3y^5 + 2y^6 + y^7 )(1 +y^1 + y^2 + y^3 + y^4 + y^5)           =(1+2y1+3y2+4y3+4y4+3y5+2y6+y7)(1+y1+y2+y3+y4+y5)



统计上述两项相乘 , y y y 的次幂值为 10 10 10 的项 :

第一个因式的 3 y 5 3y^5 3y5 与第二个因式的 y 5 y^5 y5 , 相乘为 3 y 10 3y^{10} 3y10

第一个因式的 2 y 6 2y^6 2y6 与第二个因式的 y 4 y^4 y4 , 相乘为 2 y 10 2y^{10} 2y10

第一个因式的 y 7 y^7 y7 与第二个因式的 y 3 y^3 y3 , 相乘为 y 10 y^{10} y10

y 10 y^{10} y10 项前的系数是 3 + 2 + 1 = 6 3 + 2+1 = 6 3+2+1=6



因此上述 多重集的 10 10 10 组合 ,选择方案有 6 6 6 种 ;