BZOJ3028 - 食物
Description
求满足\(x_1+x_2+x_3+x_4+x_5+x_6+x_7+x_8=n(n\leq10^{500})\)的方案数,对\(10007\)取模。其中\(2|x_1\),\(x_2\in\{0,1\}\),\(x_3\in\{0,1,2\}\),\(2|x_4-1\),\(4|x_5\),\(x_6\in\{0,1,2,3\}\),\(x_7\in\{0,1\}\),\(3|x_8\),\(x_{1..8}\geq0\)。
Solution
生成函数(generation function),多用于解决多重集的组合问题。一个多重集\(S\)对应一个数列\(\{a_k\}\),其中\(k\)为\(S\)的类别数,\(a_i\)等于\(i\)在\(S\)中的重数:那么多重集\(S\)的生成函数\(g(x)=\sum_{i=0}^{+\infty}a_ix^i\)。
这道题就是一个多重集组合的裸题。列出每个变量所在集合的生成函数:
\[\begin{align*}
g_1(x) &= 1+x^2+x^4+x^6+... = (1-x^2)^{-1} \\
g_2(x) &= 1+x \\
g_3(x) &= 1+x+x^2 \\
g_4(x) &= x+x^3+x^5+x^7+... = (1-x^2)^{-1} \\
g_5(x) &= 1+x^4+x^8+x^{12}+... = (1-x_4)^{-1} \\
g_6(x) &= 1+x+x^2+x^3 \\
g_7(x) &= 1+x \\
g_8(x) &= 1+x^3+x^6+x^9+... = (1-x^3)^{-1}
\end{align*}$$相乘得到$G(x)=x(1-x)^{-4}$,其中$x^n$项的系数,就是和为$n$的方案数。依二项式定理展开,得到
$$ G(x)=\sum_{i=1}^{+\infty} (-1)^{i-1}\binom{-4}{i-1} x^i $$$$\begin{align*}
ans &= (-1)^{n-1} \binom{-4}{n-1} \\
&= (-1)^{n-1} \frac{\prod_{i=0}^{n-2}(-4-i)}{(n-1)!} \\
&= \frac{\prod_{i=0}^{n-2}(4+i)}{(n-1)!} \\
&= \frac{\prod_{i=0}^{n-2}(4+(n-2)-i)}{(n-1)!} \\
&= \binom{n+2}{n-1} \\
&= \binom{n+2}{3} \\
&\equiv \binom{⌊\frac{n+2}{P}⌋}{0}\binom{(n+2)\bmod P}{3} &\pmod P \\
&\equiv \binom{(n+2)\bmod P}{3} &\pmod P
\end{align*}\]
时间复杂度\(O(1)\)(不包括读入)。
Code
//食物
#include <cstdio>
int const P=10007;
char n0[600];
int main()
{
scanf("%s",n0+1); int n=0;
for(int i=1;n0[i];i++) n=(n*10+n0[i]-'0')%P;
int ans=(n+2)*(n+1)%P*n%P*1668%P;
printf("%d\n",ans%P);
}
P.S.
我错误地推导出\(\binom{-4}{n-1}=\binom{P-4}{(n-1)\bmod P}\),但仍然A掉了这道题...感谢sbw巨佬
发现LaTeX代码\bmod
和\pmod
!x \bmod y
\(x \bmod y\),\pmod p
\(\pmod p\)。以前都是打mod加空格的...