[CEOI 2004] Sweets
题面
求满足如下不等式的自然数解的数量(模 \(2004\)):
- \(\forall 1\leq i\leq n, x_i\leq m_i\)
- \(\sum_{i=1}^nx_i\leq a\)
保证 \(n\leq 10, mi\leq 10^6\)。
解法一
考虑生成函数 \(f(x)=\prod_{i=1}^n(1+x+......+x^{m_i})\times\dfrac{1}{1-x}\),显然答案就是 \([x^a]f(x)\)。(最后乘的那个分数起到求前缀和的作用)
使用等比数列求和,化简,有 \(f(x)=\prod_{i=1}^n(1-x^{m_i+1})(1-x)^{-n-1}\)。
考虑前半部分是容易求出的,后半部分可以使用广义二项式定理展开,得出 \(f(x)=\prod_{i=1}^n(1-x^{m_i+1})(\sum_{k=0}^{+\infty}\binom{-n-1}{k}(-x)^k)\)
不妨设 \(g(x)=\prod_{i=1}^n(1-x^{m_i+1}), f(x)=g(x)(\sum_{k=0}^{+\infty}\binom{-n-1}{k}(-x)^k)\)。可以 \(O(2^n)\) 枚举 \(g(x)\) 中的项,使用扩展卢卡斯定理计算组合数。
PS:如果没学过广义二项式定理,可以直接对 \((1-x)^{-n-1}\) 强行泰勒/麦克劳林展开,会得到和广义二项式定理一样的结果。这也算是生成函数化简的常见技巧,遇到奇奇怪怪的封闭形式可以一律都泰勒展开。
解法二
假设不会广义二项式定理,也不会泰勒/麦克劳林展开,则可以使用组合意义。
考虑 \({\dfrac{1}{1-x})^{n+1}\) 的组合意义是对 \(y=1\) 做 \(n+1\) 次前缀和,于是可以利用前缀和的组合意义。
具体来说,设 \(h(x)=\dfrac{1}{1-x}\),则 \([x^k]h(x)\) 就是通过 \(n+1\) 次右移操作(每次操作可以移动任意步,可以不移)从 \(0\) 到 \(k\) 的方案数,根据隔板法,方案数是 \(\binom{k+n}{n}=\binom{k+n}{k}=\binom{-n-1}{k}\),后续同解法一。(实际上这就是广义二项式定理的组合解释)
解法三
容斥大法好!
考虑加上一个 \(x_{n+1}=a-\sum_{i=1}^nx_i\)。这样原问题化为要求 \(\sum_{i=1}^{n+1}x_i=a_i\) 的解数。
考虑容斥,答案就是 \(\underset{S\subseteq \{1, 2, ..., n\}}{\sum}(-1)^{|S|}\dbinom{a-\sum_{i\in S}(m_i+1)+n}{n}\)。直接计算即可。
事实上,上述三个方法的代码是一样的......
甚至进行一些恒等变形后会发现它们推出的公式都一模一样。
总结
- 泰勒展开快速求解生成函数中某些封闭形式
- 广义二项式定理
- 生成函数的代数形式和它的组合意义的相伴的,常常要将他们结合考虑,也许某些思路在推导公式过程中,进行了多次组合意义和代数形式的转化。例如写出生成函数是组合意义向代数形式的转换,而解法二为了计算代数形式,再次找到了其组合意义。

浙公网安备 33010602011771号