Description
明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。他这次又准备带一些受欢迎的食物,
如:蜜桃多啦,鸡块啦,承德汉堡等等当然,他又有一些稀奇古怪的限制:每种食物的限制如下:
承德汉堡:偶数个
可乐:0个或1个
鸡腿:0个,1个或2个
蜜桃多:奇数个
鸡块:4的倍数个
包子:0个,1个,2个或3个
土豆片炒肉:不超过一个。
面包:3的倍数个
注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。
Input
输入一个数字(N),(1le n le 10^{500})
Output
如题
Sample Input
输入样例1
1
输入样例2
5
Sample Output
输出样例1
1
输出样例2
35
生成函数题,对于每一种情况,我们构造生成函数并换成封闭形式
1:(egin{aligned}sum_{i=0}^{infty}x^{2n}=frac{1}{1-x^2}end{aligned})
2:(egin{aligned}1+xend{aligned})
3:(egin{aligned}1+x+x^2=frac{1-x^3}{1-x}end{aligned})
4:(egin{aligned}sum_{i=0}^{infty}x^{2n+1}=frac{x}{1-x^2}end{aligned})
5:(egin{aligned}sum_{i=0}^{infty}x^{4n}=frac{1}{1-x^4}end{aligned})
6:(egin{aligned}1+x+x^2+x^3=frac{1-x^4}{1-x}end{aligned})
7:(egin{aligned}1+xend{aligned})
8:(egin{aligned}sum_{i=0}^{infty}x^{3n}=frac{1}{1-x^3}end{aligned})
然后将封闭形式相乘得到答案的生成函数化简后可以得到
(egin{aligned}F(x)=frac{x}{(1-x)^4}end{aligned})
根据牛顿广义二项式定理(egin{aligned}(x+y)^n=sum_{k=0}^{infty}dbinom{n}{k}x^{n-k}y^kend{aligned}),其中重新定义(dbinom{n}{k})的计算方法
(egin{aligned}dbinom{r}{k}=frac{r imes (r-1) imes (r-2).... imes (r-k+1)}{k!}=frac{r^{underline{k}}}{k!}end{aligned})
可得
(egin{aligned}(1+x)^{-n}=sum_{k=0}^{infty}dbinom{-n}{k}x^k=sum_{k=0}^{infty}(-1)^kdbinom{n+k-1}{k}x^kend{aligned})
则(egin{aligned}F(x)=xsum_{k=0}^{infty}(-1)^kdbinom{4+k-1}{k}(-x)^k=xsum_{k=0}^{infty}dbinom{3+k}{3}x^kend{aligned})
答案为(x^n)项的系数即(dbinom{2+n}{3})
#include<bits/stdc++.h>
#define LL long long
#define _ 0
using namespace std;
/*Grievous Lady*/
template <typename _n_> void read(_n_ & _x_){
_x_ = 0;int _m_ = 1;char buf_ = getchar();
while(buf_ < '0' || buf_ > '9'){if(buf_ == '-')_m_ =- 1;buf_ = getchar();}
do{_x_ = _x_ * 10 + buf_ - '0';buf_ = getchar();}while(buf_ >= '0' && buf_ <= '9');_x_ *= _m_;
}
#define mod 10007
const int kato = 1e3 + 10;
LL n , ans;
char yuni[kato];
inline LL quick_pow(LL a , LL b){
LL res = 1;
for(; b ; b >>= 1 , a = a * a % mod){
if(b & 1){
res = res * a % mod;
}
}
return res % mod;
}
inline int Ame_(){
scanf("%s" , yuni);
for(int i = 0;i < strlen(yuni);i ++){
n = n * 10 + yuni[i] - '0';
n = n % mod;
}
ans = n * (n + 1) % mod * (n + 2) % mod * quick_pow(6 , mod - 2) % mod;
printf("%lld
" , ans);
return ~~(0^_^0);
}
int Ame__ = Ame_();
int main(){;}