组合数学:多重集的组合计数

弱菜博主竟然回来写博客了 看到了有趣的数学芝士记录一下

多重集的组合计数主要是这样一类问题:

n n n种不同的物品,每种物品有 a [ i ] a[i] a[i]个,从中取出 k k k个物品的方案数。



Part0:

显然有如下的dp做法:
d p [ i ] [ j ] dp[i][j] dp[i][j]表示前i种物品,取出j个物品的方案数,用前缀和优化就能做到 O ( n ∗ ∑ a [ i ] ) O(n*\sum{a[i]}) O(na[i])的时间复杂度,较为简单,故在此略去。


Part1:

首先考虑这样的数据范围:

n < 20 , a [ i ] < = 1 e 12 , k < = 1 e 14 n<20,a[i]<=1e12,k<=1e14 n<20,a[i]<=1e12,k<=1e14

solution1:

考虑构造生成函数如下:

∏ i = 1 n ∑ j = 0 a [ i ] x j = ∏ i = 1 n ( 1 + x + x 2 + x 3 + . . . + x a [ i ] ) \displaystyle\prod_{i=1}^n\sum_{j=0}^{a[i]}x^j=\displaystyle\prod_{i=1}^n(1+x+x^2+x^3+...+x^{a[i]}) i=1nj=0a[i]xj=i=1n(1+x+x2+x3+...+xa[i])

n n n个多项式相乘的k次方项系数即为答案,但数据范围显然不允许我们直接这样做,于是我们推推式子如下:

( 1 + x + x 2 + x 3 + . . . + x a [ i ] ) = ( 1 − x a [ i ] + 1 ) / ( 1 − x ) (1+x+x^2+x^3+...+x^{a[i]})=(1-x^{a[i]+1})/(1-x) (1+x+x2+x3+...+xa[i])=(1xa[i]+1)/(1x)
∏ i = 1 n ( 1 + x + x 2 + x 3 + . . . + x a [ i ] ) = ( ∏ i = 1 n ( 1 − x a [ i ] + 1 ) ) / ( 1 − x ) n \displaystyle\prod_{i=1}^n(1+x+x^2+x^3+...+x^{a[i]})=(\displaystyle\prod_{i=1}^n(1-x^{a[i]+1}))/(1-x)^n i=1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值