zoukankan      html  css  js  c++  java
  • 【BZOJ】3028: 食物

    http://www.lydsy.com/JudgeOnline/problem.php?id=3028

    题意:

    每种食物的限制如下:
    汉堡:偶数个;
    可乐:0个或1个
    鸡腿:0个,1个或2个
    蜜桃:奇数个
    鸡块:4的倍数个
    包子:0个,1个,2个或3个
    土豆:不超过一个。
    面包:3的倍数个

    问带$n$个物品的方案数(n<=10^500)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
    	int n=0; char c;
    	while(cin >> c) ((n*=10)+=c-'0')%=10007;
    	cout << ((n*(n+1)%10007)*(n+2)%10007)*1668%10007 << endl;
    	return 0;
    }
    

      

    学习了一下各种姿势= =

    首先母函数易得= =

    $$
    egin{align}
    汉堡 & = x^0 + x^2 + x^4 + cdots = frac{1}{1-x^2} \
    蜜桃 & = x^1 + x^3 + x^5 + cdots = frac{x}{1-x^2} \
    面包 & = x^0 + x^3 + x^6 + cdots = frac{1}{1-x^3} \
    鸡块 & = x^0 + x^4 + x^8 + cdots = frac{1}{1-x^4} \
    土豆 & = x^0 + x^1 = frac{1-x^2}{1-x} \
    可乐 & = x^0 + x^1 = frac{1-x^2}{1-x} \
    鸡腿 & = x^0 + x^1 + x^2 = frac{1-x^3}{1-x} \
    包子 & = x^0 + x^1 + x^2 + x^3 = frac{1-x^4}{1-x} \
    end{align}
    $$

    乘起来就是 $ f(x) = frac{x}{(1-x)^4} $

    根据泰勒展开$sum_{i=0}^{infty} x^i = frac{1}{1-x}$

    发现
    $$ f(x) = x left( frac{1}{1-x} ight)^4 = x left( sum_{i=0}^{infty} x^i ight)^4 $$

    而$left( sum_{i=0}^{infty} x^i ight)^n$中的$x$的$a$次项的系数是$inom{a+n-1}{n-1}$

    证明:

    对于系数$a$,由于有$n$个多项式相乘,我们就设$a$由$n$个非负数的和。而由于有$0$的出现,我们将式子两边加上$n$,这样就能没负数啦= =。将这些数全部变成$1$的和,即$a+n = 1 + 1 + 1 + cdots +1$,假设有$n-1$个竖线插在这$a+n$个$1$之间,即有$a+n-1$个位置,那么显然$inom{a+n-1}{n-1}$就是答案= =(即分割成$n$份。

    所以答案就是$f(x)$的$x$的$n$次系数,即$inom{n+2}{3}$

  • 相关阅读:
    logback学习二
    logback学习
    弱类型、强类型、动态类型、静态类型语言的区别
    BlockingQueue
    ExecutorService
    Future学习
    SetTimeout()多次运行函数后越来越快的问题
    LISTAGG函数
    Oracle字段
    使用powerdesigner进行数据库设计
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4346848.html
Copyright © 2011-2022 走看看