指数型母函数相关知识请查看书!!
#include<stdio.h>
#include<string.h>
#define nmax 15
int num[nmax];
double res[nmax], fac[nmax], temp[nmax];
void init(int n) //先算好所有阶乘!最多也只到10! 打好表!
{
int i;
fac[0] = 1; //0的阶乘为1哦!
for (i = 1; i <= n; i++)
{
fac[i] = fac[i - 1] * i;
}
}
int main()
{
int i, j, k, n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
init(n); //先计算阶乘
for (i = 0; i < n; i++)
{
scanf("%d", num + i);
}
memset(res, 0.0, sizeof(res));
memset(temp, 0.0, sizeof(res));
for (i = 0; i <= num[0]; i++)
{
res[i] = 1.0 / fac[i]; //①式
}
for (i = 1; i < n; i++) //res和第i个多项式相乘
{
for (j = 0; j <= n; j++) //res多项式的每一项j
{
for (k = 0; (k <= num[i]) && (k + j <= n); k++) //第i个多项式的每一项k (两个限制条件要注意)
{
temp[j + k] += res[j] / fac[k]; //②式
}
}
for (j = 0; j <= n; j++)
{
res[j] = temp[j]; //把临时的返回给res,重构一个多项式.
temp[j] = 0; //临时的清零。
}
}
printf("%.0lf\n", res[m] * fac[m]);//③
}
return 0;
}
/*
①②式是这么个过程:如①式中有 x^2/2! 到②式时 x^5的系数==(x^2/2!)*(x^3/3!)==((x^5)/(2!3!))
注意1/(2!3!)整体为x^5的系数。所以③式 *fac[m]的原因就是为了得到:去除阶乘的系数!!
而这个才是我们需要的
*/