BZOJ3027 - [Ceoi2004]Sweet

BZOJ3027 - Click Here

  

Description

  John得到了n罐糖果。不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的)。第i个糖果罐里有mi个糖果。John决定吃掉一些糖果,他想吃掉至少a个糖果,但不超过b个。问题是John 无法确定吃多少个糖果和每种糖果各吃几个。有多少种方法可以做这件事呢?

  

Input

  从标准输入读入每罐糖果的数量,整数a到b

  John能够选择的吃掉糖果的方法数(满足以上条件)

  

Output

  把结果输出到标准输出(把答案模 2004 输出)

  1<=n<=10,0<=a<=b<=10^7,0<=mi<=10^6

  

Solutions

  WC时就切掉的题,结果到现在才写qwq

  这种多次选择之间相互独立的题,范围又那么大,大概就是个生成函数了。

  

  对于第$t$个糖果罐,易得其生成函数为$f(x) = \sum_{i=0}^{m_t} x^i = \frac{1 - x^{m_t + 1}}{1 - x}$

  设答案的生成函数为$g(x)$,则$g(x)=\prod_{t=1}^n \frac{1 - x^{m_t + 1}}{1 - x} = (1-x)^{-n} \prod_{t=1}^n (1-x^{m_t +1})$

  而题目要求的是$\sum_{i=a}^b [x^i]g(x)$,该式等价于$\sum_{i=1}^b [x^i]g(x) - \sum_{i=1}^{a - 1} [x^i]g(x)$

  

  因此只需要将$g(x)$展开即可解决问题,考虑如何展开。

  注意到题目中的$n$很小,因此可以暴力展开$\prod_{i=1}^n (1-x^{m_i +1})$。此时$g(x) = \sum a_ix^{i}(1-x)^{-n}$

  

  这样就转换成了对一个二项式求其系数之和,设$h(x)=a_ix^{i}(1-x)^{-n}$

  对于一个固定的$i$,有$h(x) = a_ix^i \sum_{0 \leq k} \binom {-n}{k}(-x)^k = \sum_{i \leq k} a_i \binom{n-1+k-i}{n-1}x^k$

  则$\sum_{k=1}^b [x^k]h(x) = \sum_{k=i}^b a_i \binom{n-1+k-i}{n-1} = \sum_{k=0}^{b-i} a_i \binom{n-1+k}{n-1} = a_i \binom{n+b-i}{n}$

  因此$\sum_{i=1}^b [x^i]g(x) = \sum a_i\binom{n+b-i}{n}$

  

  直接统计即可,时间复杂度$O(n2^n)$

  

CODE

CODE - Click Here

本站总访问量次 | 本站访客数人次

Powered by Hexo | Designed by iTimeTraveler | Refined by CSHwang