3028: 食物
Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 89 Solved: 47
[Submit][Status]
Description
明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!
我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。
他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等
当然,他又有一些稀奇古怪的限制:
每种食物的限制如下:
承德汉堡:偶数个
可乐:0个或1个
鸡腿:0个,1个或2个
蜜桃多:奇数个
鸡块:4的倍数个
包子:0个,1个,2个或3个
土豆片炒肉:不超过一个。
面包:3的倍数个
注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。
Input
输入样例1
1
输出样例1
1
输入样例2
5
输出样例2
35
数据范围
对于40%的数据,1<=N<=100000;
对于所有数据,1<=n<=10^500;
Output
Sample Input
Sample Output
HINT
Source
首先列出所有食物的母函数
汉堡:1+x^2+x^4+.....=1/(1-x^2)
可乐:1+x
鸡腿:1+x+x^2
蜜桃多:x+x^3+x^5+.....=x/(1-x^2)
鸡块:1+x^4+x^8+....=1/(1-x^4)
包子:1+x+x^2+x^3
土豆:1+x
面包:1+x^3+x^6+...=1/(1-x^3)
母函数有一个很有用的用处:把所有食物的母函数相乘后,x^n项的系数就是答案
解法一:
那么我们把母函数相乘
[1/(1-x^2)]*(1+x)*(1+x+x^2)* [x/(1-x^2)]*[1/(1-x^4)] *[1+x+x^2+x^3]*[(1+x)]*[1/(1-x^3)]
化简后得到 x/(1-x)^4,过程略,化简主要用到的公式平方差公式和:1+x+x^2+x^3+......x^n=(x^(n+1)-1)/(x-1)还有:1+x+x^2+x^3+...x^(无限)=1/(1-x)
x/(1-x)^4 =x*(1/(1-x)^4)
=x*(1+x+x^2+x^3+x^4+.....x^(无限))^4
=x*((1+x+x^2+x^3+x^4+.....x^(无限))^2)^2
现在计算(1+x+x^2+x^3+x^4+.....x^(无限))^2
显然可得(1+x+x^2+x^3+x^4+.....x^(无限))^2=1+2x+3x^2+4x^3+......x^(无限)
显然这个多项式中系数是指数+1
然后可以计算1(1-x)^4了
x/(1-x)^4=x*(1+x+x^2+x^3+x^4+.....x^(无限))^4
=x*((1+x+x^2+x^3+x^4+.....x^(无限))^2)^2
=x*(1+2x+3x^2+4x^3+......x^(无限))^2
根据多项式乘法的定义
设A,B,C是3个多项式 F(A,I)表示多项式A中x^i项的系数
若A*B=C
则F(C,X)=∑(F(A,K)*F(B,X-K)) {K=0....X}
设A=B=1+2x+3x^2+4x^3+......x^(无限)
那么F(C,N-1)就是我们要求的答案
(注:由于x*(1/(1-x)^4),外面乘了个x,所以我们求的是F(C,N-1)而不是F(C,N))
观察1+2x+3x^2+4x^3+......x^(无限)的特性可知:
F(A,X)=X+1 F(B,X)=X+1
那么F(C,N-1)=∑(F(A,K)*F(B,N-1-K)) {K=0....N-1}
=∑((K+1)*(N-1-K+1)) {K=0....N-1}
=∑((K+1)*(N-K))
=∑(K*N-K^2+N-K)
=(∑K*N)-∑(K^2)+∑(N-K)
=(N*N*(N-1)/2)-(N*(N-1)*(2N-1)/6)+(N(N+1)/2)
=(N(N^2+1)/2)-(N*(N-1)*(2N-1)/6)
=(N(N^2+3N+2)/6)
=N(N+1)(N+2)/6
然后逆元什么的搞搞就好了
解法二:
如果有公式恐惧症的话,下面提供Stilwell大神的一种较清晰的解法
x*(1+x+x^2+x^3+x^4+.....x^(无限))^4
可以发现其中(1+x+x^2+x^3+x^4+.....x^(无限))^4的x^n项的系数为:将n整数划分成4个自然数的方案数
然后用类似插板一样的东西就行了