[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 ;
}
posted @ 2019-03-13 21:24  beretty  阅读(139)  评论(0编辑  收藏  举报