ことばがありあまれどなお、 このゆめはつづい|

trsins

园龄:3年10个月粉丝:18关注:2

【做题记录】CEOI2004 Sweet

  • [CEOI2004\ Sweet]

    • 算法:生成函数

题目:

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

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

题解:

每种糖果 mi 个,直接构造每种糖果的生成函数相乘

i=1n1xmi+11x

对于答案其实就是 f(a)f(b1)

对于分母对 i 次项的贡献是 (i+n1n1)

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

分子求出来的第i次项的系数我们设为 pi

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

k=0mpki=0mk(Ci+n1n1)

发现后面这个东西 i=0mk(i+n1n1) 是杨辉三角的同一列

稍微画一下即可发现杨辉三角的性质,就可以把这个东西转化为 (n+mkn)

于是答案就是 k=0mpkCn+mkn

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

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

但是我们在求组合数时要求的是 (n+mkm),也就是(n+mk)!n!(mk)!

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

本文作者:trsins

本文链接:https://www.cnblogs.com/trsins/p/15776595.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   trsins  阅读(18)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示