• [BZOJ 3028]食物(生成函数)


    Description

    明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!
    我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。
    他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等
    当然,他又有一些稀奇古怪的限制:
    每种食物的限制如下:
      承德汉堡:偶数个
      可乐:0个或1个
      鸡腿:0个,1个或2个
      蜜桃多:奇数个
      鸡块:4的倍数个
      包子:0个,1个,2个或3个
      土豆片炒肉:不超过一个。
      面包:3的倍数个
    注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。
    Solution
    1<=n<=10^500 所以看起来就是要推柿子了
     
    把一堆生成函数的闭形式乘起来可以得到 x/(1-x)即 x*(1+x+x2+x3+x4...)4
     

    但是“不定方程的非负整数解的个数”是我一点也不熟悉的问题= =

    于是我找到了这个:-wzq

    嗯!然后就得到了:这个柿子n次项的系数就是C(3,n+3),因为还乘了一个x所以我们把它平移一位变成了C(3,n+2)

    所以说答案就是(n+2)(n+1)n/6

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define Mod 10007
    using namespace std;
    int read()
    {
        int x=0;char c=getchar();
        while(c<'0'||c>'9')c=getchar();
        while(c>='0'&&c<='9'){x=(x*10+c-'0')%Mod;c=getchar();}
        return x;
    }
    void exgcd(int a,int b,int &x,int &y,int &d)
    {
        if(!b){d=a,x=1,y=0;return;}
        exgcd(b,a%b,y,x,d);y-=x*(a/b);
    }
    int inv(int a,int p)
    {
        int d,x,y;exgcd(a,p,x,y,d);
        return (x+p)%p;
    }
    int main()
    {
        int n=read();
        printf("%d
    ",((((n+2)*(n+1))%Mod*n)%Mod*inv(6,Mod))%Mod);
        return 0;
    }
  • 相关阅读:
    System.DateUtils 1. DateOf、TimeOf 简单修饰功能
    Servlet高级
    Servlet基础
    AOP的基本概念
    Bean的定义及作用域的注解实现
    Bean
    centos7系统下,配置学校客户端网络记录
    CUDA并行编程思维过程
    CUDA(GPU)OPENCV
    3-决策树
  • 原文地址:https://www.cnblogs.com/Zars19/p/6972487.html
Copyright © 2020-2023  润新知