【bzoj3028】 食物 生成函数+隔板法

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3028

 

这题的推导很妙啊,裸的推母函数的题。

我们首先构造出每种食物的母函数:

汉堡:$1+x^2+x^4+……=\frac{1}{1-x^2}$

可乐:$1+x=\frac{1-x^2}{1-x}$

鸡腿:$1+x+x^2=\frac{1-x^3}{1-x}$

蜜桃:$x+x^3+x^5+......=\frac{x}{1-x^2}$

鸡块:$1+x^4+x^8+......=\frac{1}{1-x^4}$

包子:$1+x+x^2+x^3=\frac{1-x^4}{1-x}$

炒肉:$1+x=\frac{1-x^2}{1-x}$

面包:$1+x^3+x^6+......=\frac{1}{1-x^3}$

 

然后,我们将这八个母函数乘起来,得到$\frac{x}{(1-x)^4}$,所求答案为$\frac{x}{(1-x)^4}$的n次项系数。

考虑如何求这个东西,不难发现,$\frac{x}{(1-x)^4}=x \times (\frac{1}{1-x})^4$,然后又因为$\frac{1}{1-x}=\sum_{i=0}{\infty} x^i$,可以想象成有一个物品集合A,其中每种权值恰好有1个,那么$\frac{x}{(1-x)^4}$的n次项系数相当于从4个A集合中各取出1个,并且这4个物品的权值和为n的方案数,这个东西通过插板法简单推导下可以推出其答案为$\binom{n+2}{3}$。

由于n很大,读入的时候先取个模再求答案即可。

代码很短,推导稍长....

 1 #include<bits/stdc++.h>
 2 #define MOD 10007
 3 #define INV6 1668
 4 using namespace std;
 5 char c[12345]={0};
 6 
 7 int main(){
 8     scanf("%s",c);
 9     int len=strlen(c),n=0;
10     for(int i=0;i<len;i++) n=(n*10+c[i]-'0')%MOD;
11     printf("%d\n",n*(n+1)%MOD*(n+2)%MOD*INV6%MOD);
12 }    

 

posted @ 2018-05-10 21:10  AlphaInf  阅读(283)  评论(0编辑  收藏  举报