[CEOI 2004] Sweets
有 \(n\) 种糖果,每种有 \(m_i\) 个,问有多少种选糖方式满足总糖数是 \(a \sim b\) 个。答案对 \(2004\) 取模。
\(n \le 10, a, b \le 10^7\)
对于第 \(i\) 种糖,构造生成函数 \(1 + x + x^2 + \dots + x^{m_i} = \frac{1 - x^{m_i + 1}}{1 - x}\),因此总方案对应的生成函数就是:
要求吃 \(a \sim b\) 个糖果,就是 \(\sum\limits_{i = a}^b [x^i]f(x)\),转化为前缀和的形式,对应的生成函数 \(F(x) = \frac{f(x)}{1 - x}\)(实际上理解是 \(\times (1 + x + x^2 + \dots)\))
那么只需要求 \([x^b]F(x) - [x^{a - 1}]F(x)\) 即可,接下来就是化简 \(F(x)\):
\((1) \rightarrow (2)\) 的部分运用了 \((1 - x)^{-n} = \sum\limits_{i = 0}^{+\infty} C_{n + i - 1}^{i} x^i\) 这个公式,可以搜搜。
对于后面的部分,直接 \(2^n\) 枚举即可。得到前半部分对应的指数范围 \([l, r]\),就有 \(C_{n + r}^r x^r - C_{n + l - 1}^{l - 1}x^{l - 1}\) 的贡献。
但是还有一个问题,如何计算 \(C_{n + x}^x \mod 2004\) 的结果。一种粗暴的方式是使用 exlucas。但有一种更简单的方式,因为 \(C_{n + x}^x = C_{n + x}^n = \frac{(x + n)(x + n - 1)\dots(x + 1)}{n!}\),利用 \(ak \equiv bk \pmod {ck} \iff a \equiv b \pmod c\) 的性质,可以求出分子部分 \(\mod 2004n!\) 的答案,再除以 \(n!\) 阶乘即可。
时间复杂度:\(O(n2^n)\)
浙公网安备 33010602011771号