Description
求满足(x_1+x_2+x_3+x_4+x_5+x_6+x_7+x_8=n(nleq10^{500}))的方案数,对(10007)取模。其中(2|x_1),(x_2in{0,1}),(x_3in{0,1,2}),(2|x_4-1),(4|x_5),(x_6in{0,1,2,3}),(x_7in{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)。
这道题就是一个多重集组合的裸题。列出每个变量所在集合的生成函数:
[egin{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}inom{-4}{i-1} x^i $$$$egin{align*}
ans &= (-1)^{n-1} inom{-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)!} \
&= inom{n+2}{n-1} \
&= inom{n+2}{3} \
&equiv inom{⌊frac{n+2}{P}⌋}{0}inom{(n+2)mod P}{3} &pmod P \
&equiv inom{(n+2)mod 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
",ans%P);
}
P.S.
我错误地推导出(inom{-4}{n-1}=inom{P-4}{(n-1)mod P}),但仍然A掉了这道题...感谢sbw巨佬
发现LaTeX代码mod
和pmod
!x mod y
(x mod y),pmod p
(pmod p)。以前都是打mod加空格的...