【做题记录】CEOI2004 Sweet
-
\([\text{CEOI2004\ Sweet}]\)
- 算法:生成函数
题目:
有 \(n\) 堆糖果。不同的堆里糖果的种类不同(即同一个堆里的糖果种类是相同的,不同的堆里的糖果的种类是不同的)。第 \(i\) 个堆里有 \(m_i\) 个糖果。现在要吃掉至少 \(a\) 个糖果,但不超过 \(b\) 个。求有多少种方案。
两种方案不同当且仅当吃的个数不同,或者吃的糖果中,某一种糖果的个数在两个方案中不同。
题解:
每种糖果 \(m_{i}\) 个,直接构造每种糖果的生成函数相乘
对于答案其实就是 \(f(a)-f(b-1)\),
对于分母对 \(i\) 次项的贡献是 \(\binom{i+n-1}{n-1}\)
而分子我们不太好直接求,发现只有 \(2^{n}\) 项,于是直接爆搜即可。
分子求出来的第\(i\)次项的系数我们设为 \(p_{i}\)。
而在求 \(f(m)\) 时,它的答案应该是
发现后面这个东西 \(\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!\) 即可。