HDU 1521 排列组合

Problem Description
 
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
 
Input
每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量。
Output
对应每组数据输出排列数。(任何运算不会超出2^31的范围)
 
Sample Input
2 2 1 1
Sample Output
2
指数型母函数模板题
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 double a[12],b[12];
 8 long long fac[12];
 9 int d[12],n,m;
10 int main()
11 {int i,j,k;
12   while (cin>>n>>m)
13   {
14     memset(a,0,sizeof(a));
15     memset(b,0,sizeof(b));
16     for (i=1;i<=n;i++)
17      scanf("%d",&d[i]);
18     fac[0]=1;
19     for (i=1;i<=10;i++)
20       fac[i]=fac[i-1]*i;
21     a[0]=1;
22     for (i=1;i<=n;i++)
23       {
24     memset(b,0,sizeof(b));
25     for (j=0;j<=d[i];j++)
26       {
27         for (k=0;k<=m-j;k++)
28           b[k+j]+=a[k]/(double)fac[j];
29       }
30     memcpy(a,b,sizeof(b));
31       }
32     printf("%.0lf
",a[m]*fac[m]);
33   }
34 }