【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 imes (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的方案数,这个东西通过插板法简单推导下可以推出其答案为$inom{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+1)%MOD*(n+2)%MOD*INV6%MOD);
12 }    
原文地址:https://www.cnblogs.com/xiefengze1/p/9021754.html