题目
Description
明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等当然,他又有一些稀奇古怪的限制:每种食物的限制如下:
承德汉堡:偶数个
可乐:0个或1个
鸡腿:0个,1个或2个
蜜桃多:奇数个
鸡块:4的倍数个
包子:0个,1个,2个或3个
土豆片炒肉:不超过一个。
面包:3的倍数个
注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。
Input
输入一个数字N,1<=n<=10^500
Output
如题
Sample Input
输入样例1
1
输入样例2
5
Sample Output
输出样例1
1
输出样例2
35
题解
首先先列出这$8$个生成函数
$1+x^2+x^4+x^6+…$
$1+x$
$1+x+x^2$
$x+x^3+x^5+x^7+…$
$1+x^4+x^8+x^{12}+…$
$1+x+x^2+x^3$
$1+x$
$1+x^3+x^6+x^9+…$
那么答案就是它们乘起来第$x^n$项的系数
$(1+x^2+x^4+x^6+…)(1+x)(1+x+x^2)(x+x^3+x^5+x^7+…)(1+x^4+x^8+x^{12}+…)(1+x+x^2+x^3)(1+x)(1+x^3+x^6+x^9+…)$
把它们化简成等比数列求和的形式
$\frac{1}{1-x^2}\frac{1-x^2}{1-x}\frac{1-x^3}{1-x}\frac{x}{1-x^2}\frac{1}{1-x^4}\frac{1-x^4}{1-x}\frac{1-x^2}{1-x}\frac{1}{1-x^3}$
这个玩意约下分就变成了$\frac{x}{(1-x)^4}$
考虑这个生成函数的意义,$\frac{1}{(1-x)^k}=(\frac{1}{1-x})^k=(1+x+x^2+x^3+…)^k$,这个式子$x^n$的系数是$a_1+a_2+a_3+…+a_n=k$的非负整数解(多项式定理),即$C_{k+n-1}^{n-1}$(插板法);而$xF(x)$($F(x)$指某多项式)表示让$F(x)$的每一项次数都加$1$,所以$x^{n-1}$的系数代表原来$x^n$的系数
所以最终答案为$C_{4+(n-1)-1}^{n-1}=\frac{(n+2)!}{3!(n-1)!}=\frac{n(n+1)(n+2)}{3!}$
代码
# include<iostream>
# include<cstring>
# include<cstdio>
# include<algorithm>
using namespace std;
const int mod=10007;
int n,inv6=11675;
int read()
{
int x(0);
char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);x=(x*10+ch-48)%mod,ch=getchar());
return x;
}
int main()
{
return n=read(),printf("%d",1ll*n*(n+1)%mod*(n+2)%mod*inv6%mod),0;
}