指数型母函数
指数阶一般求解的问题:已知有n种颜色的球,第1种X1个,第2种X2个,第3种X3个。。。求从中取m个的方案数(组合数)。
公式中的ak/k!就是所求的组合数,ak为排列数。
只要把求系数的时候每个都相应的 除以i的阶乘即可
#include<stdio.h> #include<string.h> int main() { int i,j,k,m,n,a[20],c[11]; c[0]=1; for(i=1;i<=10;i++) c[i]=c[i-1]*i; double c1[20],c2[20]; while(scanf("%d%d",&n,&m)!=-1) { memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=1;i<=n;i++) scanf("%d",&a[i]); c1[0]=1.0; for(i=1;i<=n;i++) { for(j=0;j<=m;j++) for(k=0;k+j<=m&&k<=a[i];k++) c2[j+k]+=c1[j]/c[k]; for(j=0;j<=m;j++) {c1[j]=c2[j];c2[j]=0;} } printf("%.0f\n",c1[m]*c[m]); } return 0; }