BZOJ3028 食物

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(){;}
原文地址:https://www.cnblogs.com/Ame-sora/p/13596410.html