题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1521
题解:指数型母函数模板题。有不懂的可以看我的这篇博客(介绍母函数的):https://blog.csdn.net/qq_41515833/article/details/88072565
ac代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=15;
double a[maxn],b[maxn];
int fact[maxn];
int num[maxn];
void init(){//计算阶乘
fact[0]=1;
for(int i=1;i<maxn;i++)
fact[i]=i*fact[i-1];
memset(a,0,sizeof a);
memset(b,0,sizeof b);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=0;i<=num[1];i++)//第一项初始赋值
a[i]=1.0/fact[i];
for(int i=2;i<=n;i++){//循环第2到第n项
for(int j=0;j<=m;j++)
for(int k=0;k<=num[i]&&k+j<=m;k++)
b[k+j]+=a[j]/fact[k];//组合排序,指数是k+j,系数是a[j]/fact[k]
for(int j=0;j<=m;j++){
a[j]=b[j];
b[j]=0;
}
}
printf("%.0f\n",a[m]*fact[m]);//此时a[m]表示指数为m的那一项的系数和,再乘以m!就是答案了。
}
}