hdu 1521 排列组合(指数型生成函数板子)
题意:种问题
思路:就是为了弄分板子,但是我觉得板子和我想的有点不一向,我以为会和我普通箱的生成函数板子一样,可能这个会有一点点慢(直觉问题,铁匠的直觉)
代码:
#include<stdio.h> #include<string.h> double fi[15]; void init()///指数型生成函数需要对每一项除阶乘 { int i; fi[0]=fi[1]=1; for(i=2;i<=10;i++) fi[i]=fi[i-1]*i; } int main() { int i,j,k,n,m,num[15]; double a[15],b[15]; init(); while(~scanf("%d%d",&n,&m)){ for(i=1;i<=n;i++) scanf("%d",&num[i]); for(i=0;i<=10;i++){ a[i]=0.0; b[i]=0.0; } for(i=0;i<=num[1];i++){ a[i]=1.0/fi[i]; } for(i=2;i<=n;i++){ for(j=0;j<=m;j++){ for(k=0;k<=num[i]&&j+k<=m;k++){ b[j+k]=b[j+k]+a[j]/fi[k]; } } for(j=0;j<=m;j++){ a[j]=b[j]; b[j]=0; } } printf("%.0f\n",a[m]*fi[m]); } return 0; }