[BZOJ3028]食物
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
题解
生成函数简单题
就是等比数列求和的应用
原题目的要求可以看做以下几个生成函数
\(1+x^2+x^4+...=\frac{1}{1-x^2}\\
1+x=\frac{1 - x^2}{1 - x}\\
1+x+x^2=\frac{1-x^3}{1-x}\\
x+x^3+x^5+...=\frac{1}{1-x}-\frac{1}{1-x^2}=\frac{x}{1-x^2}\\
1+x^4+x^8+...=\frac{1}{1-x^4}\\
1+x+x^2+x^3=\frac{1-x^4}{1-x}\\
1+x=\frac{1-x^2}{1-x}\\
1+x^3+x^6+...=\frac{1}{1-x^3}\)
把这些都乘起来最后得到的就是\(\frac{x}{(1-x)^4}\)
如果是我们常见的\(\frac{1}{(1-x)^4}\)
那么答案就应该是\(C(n+3 , 3)\)
但是分子是\(x\),也就是说所有项都要升一次幂,所以对应的系数就应该是\(C(n+2,3)\)
代码
#include<cstdio>
const int mod = 10007 ;
using namespace std ;
inline int read() {
char c = getchar() ; int x = 0 , w = 1;
while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; x %= mod ; }
return x*w ;
}
int n ;
int main() {
n = read() ;
printf("%d\n",1LL * n * (n + 1) * (n + 2) % mod * 1668 % mod) ;
return 0 ;
}