G35 指数生成函数_哔哩哔哩_bilibili
HDU - 1521 排列组合 (指数生成函数)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
int a[11];
double fac[11];
double C[11],D[22];
void init(){//计算阶乘
fac[0]=fac[1]=1;
for(int i=2;i<=100;++i)
fac[i]=fac[i-1]*i;
}
double calc(){
for(int i=0;i<=m;++i) C[i]=D[i]=0;
for(int i=0;i<=a[1];++i) C[i]=1.0/fac[i];
for(int i=2;i<=n;++i){
//计算x^(j+k)的系数
for(int j=0;j<=m;++j)
for(int k=0;k<=a[i];++k)
D[j+k]+=C[j]/fac[k];
//转存C,清空D
for(int j=0;j<=m;++j)
C[j]=D[j], D[j]=0;
}
return C[m]*fac[m];
}
int main(){
init();
while(~scanf("%d%d",&n,&m)){
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
printf("%.0lf\n",calc());
}
return 0;
}