• 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(){;}
    
  • 相关阅读:
    C#深入浅出 修饰符(二)
    HDU 5785 Interesting
    HDU 5783 Divide the Sequence
    HDU 5781 ATM Mechine
    UVA 714 Copying Books
    uva 1471 Defense Lines
    UVA 11134 Fabled Rooks
    UVA 11572 Unique Snowflakes
    UVA 11093 Just Finish it up
    UVA 10954 Add All
  • 原文地址:https://www.cnblogs.com/Ame-sora/p/13596410.html
Copyright © 2020-2023  润新知