[BZOJ3028]食物

Posted by Dispwnl on March 3, 2019

题目

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;
}