BZOJ3028 食物
Description
明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。他这次又准备带一些受欢迎的食物,
如:蜜桃多啦,鸡块啦,承德汉堡等等当然,他又有一些稀奇古怪的限制:每种食物的限制如下:
承德汉堡:偶数个
可乐:0个或1个
鸡腿:0个,1个或2个
蜜桃多:奇数个
鸡块:4的倍数个
包子:0个,1个,2个或3个
土豆片炒肉:不超过一个。
面包:3的倍数个
注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。
Input
输入一个数字\(N\),\(1\le n \le 10^{500}\)
Output
如题
Sample Input
输入样例1
1
输入样例2
5
Sample Output
输出样例1
1
输出样例2
35
生成函数题,对于每一种情况,我们构造生成函数并换成封闭形式
1:\(\begin{aligned}\sum_{i=0}^{\infty}x^{2n}=\frac{1}{1-x^2}\end{aligned}\)
2:\(\begin{aligned}1+x\end{aligned}\)
3:\(\begin{aligned}1+x+x^2=\frac{1-x^3}{1-x}\end{aligned}\)
4:\(\begin{aligned}\sum_{i=0}^{\infty}x^{2n+1}=\frac{x}{1-x^2}\end{aligned}\)
5:\(\begin{aligned}\sum_{i=0}^{\infty}x^{4n}=\frac{1}{1-x^4}\end{aligned}\)
6:\(\begin{aligned}1+x+x^2+x^3=\frac{1-x^4}{1-x}\end{aligned}\)
7:\(\begin{aligned}1+x\end{aligned}\)
8:\(\begin{aligned}\sum_{i=0}^{\infty}x^{3n}=\frac{1}{1-x^3}\end{aligned}\)
然后将封闭形式相乘得到答案的生成函数化简后可以得到
\(\begin{aligned}F(x)=\frac{x}{(1-x)^4}\end{aligned}\)
根据牛顿广义二项式定理\(\begin{aligned}(x+y)^n=\sum_{k=0}^{\infty}\dbinom{n}{k}x^{n-k}y^k\end{aligned}\),其中重新定义\(\dbinom{n}{k}\)的计算方法
\(\begin{aligned}\dbinom{r}{k}=\frac{r\times (r-1) \times (r-2)....\times (r-k+1)}{k!}=\frac{r^{\underline{k}}}{k!}\end{aligned}\)
可得
\(\begin{aligned}(1+x)^{-n}=\sum_{k=0}^{\infty}\dbinom{-n}{k}x^k=\sum_{k=0}^{\infty}(-1)^k\dbinom{n+k-1}{k}x^k\end{aligned}\)
则\(\begin{aligned}F(x)=x\sum_{k=0}^{\infty}(-1)^k\dbinom{4+k-1}{k}(-x)^k=x\sum_{k=0}^{\infty}\dbinom{3+k}{3}x^k\end{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\n" , ans);
return ~~(0^_^0);
}
int Ame__ = Ame_();
int main(){;}