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(){;}
posted @ 2020-09-01 15:24  Ame_sora  阅读(120)  评论(0编辑  收藏  举报