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

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

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

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

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

汉堡:$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很大,读入的时候先取个模再求答案即可。

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

 #include<bits/stdc++.h>
#define MOD 10007
#define INV6 1668
using namespace std;
char c[]={}; int main(){
scanf("%s",c);
int len=strlen(c),n=;
for(int i=;i<len;i++) n=(n*+c[i]-'')%MOD;
printf("%d\n",n*(n+)%MOD*(n+)%MOD*INV6%MOD);
}
上一篇:利用DataSet更改数据,将更改保存到数据库中


下一篇:canal入门Demo