【做题记录】CEOI2004 Sweet

  • \([\text{CEOI2004\ Sweet}]\)

    • 算法:生成函数

题目:

\(n\) 堆糖果。不同的堆里糖果的种类不同(即同一个堆里的糖果种类是相同的,不同的堆里的糖果的种类是不同的)。第 \(i\) 个堆里有 \(m_i\) 个糖果。现在要吃掉至少 \(a\) 个糖果,但不超过 \(b\) 个。求有多少种方案。

两种方案不同当且仅当吃的个数不同,或者吃的糖果中,某一种糖果的个数在两个方案中不同。

题解:

每种糖果 \(m_{i}\) 个,直接构造每种糖果的生成函数相乘

\[\prod_{i=1}^{n}\frac{1-x^{m_{i}+1}}{1-x} \]

对于答案其实就是 \(f(a)-f(b-1)\)

对于分母对 \(i\) 次项的贡献是 \(\binom{i+n-1}{n-1}\)

而分子我们不太好直接求,发现只有 \(2^{n}\) 项,于是直接爆搜即可。

分子求出来的第\(i\)次项的系数我们设为 \(p_{i}\)

而在求 \(f(m)\) 时,它的答案应该是

\[\sum_{k=0}^{m}p_{k}\sum_{i=0}^{m-k}(C_{i+n-1}^{n-1}) \]

发现后面这个东西 \(\large\sum\limits_{i=0}^{m-k}\binom{i+n-1}{n-1}\) 是杨辉三角的同一列

稍微画一下即可发现杨辉三角的性质,就可以把这个东西转化为 \(\binom{n+m-k}{n}\)

于是答案就是 \(\large\sum\limits_{k=0}^{m}p_{k}C_{n+m-k}^{n}\)

那么搜分子的时候每次统计答案即可。

还有个细节是这题要对 \(2004\) 取模,不是质数,所以不能直接逆元。

但是我们在求组合数时要求的是 \(\binom{n+m-k}{m}\),也就是\(\dfrac{(n+m-k)!}{n!(m-k)!}\)

\((m-k)!\) 约掉,我们就只用除以 \(n!\) 这个东西了,\(n\) 非常小,\(mod\) 也非常小,那我们直接对 \(n!*mod\) 取模就好了,最后返回答案时再除以一个 \(n!\) 即可。

posted @ 2022-01-07 19:28  trsins  阅读(15)  评论(0编辑  收藏  举报