G35 指数生成函数
视频链接:https://www.bilibili.com/video/BV1BM411C7bU/
#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; }