指数型生成函数用于解决从n个堆中取东西进行排列的问题。
用double进行处理然后取整。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
double jc(int n)
{
double ans=1.0;
for(int i=1;i<=n;i++)
ans*=i;
return ans;
}
int main()
{
int n,m;
double c[15],d[15];
int in[15];
while(cin>>n>>m)
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
cin>>in[i];
for(int i=0;i<=min(in[1],m);i++)
c[i]=1.0/jc(i);
for(int i=2;i<=n;i++)
{
for(int j=0;j<=min(in[i],m);j++)
{
for(int k=0;k<=m;k++)
{
if(j+k>m) break;
d[j+k]+=c[k]*1.0/jc(j);
}
}
for(int j=0;j<=m;j++)
{
c[j]=d[j];
d[j]=0;
}
}
printf("%.0lf\n",c[m]*jc(m));
}
return 0;
}