HDU 1521 排列 指数母函数

来源:互联网 发布:怎么告别人网络诽谤 编辑:程序博客网 时间:2024/06/03 19:10

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1521

有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。


思路:指数型母函数模板题。

#include<iostream>#include<string.h>#include<stdio.h>using namespace std;int jc(int s){    int ans=1;    for (int i = 1; i <= s; i++)        ans *= i;    return ans;}int main(){    int a[15];double c1[15], c2[15];    int m, n,i,j;    while (cin >> n >> m)    {        memset(c1, 0, sizeof(c1));        memset(c2, 0, sizeof(c2));        for (i = 1; i <= n; i++)            cin >> a[i];        for (i = 0; i <= a[1]; i++)            c1[i] = 1.0 / jc(i);//先把分母也当做系数包含进去        for (i = 2; i <= n; i++)        {            for(j=0;j<=m;j++)                for (int k = 0; k + j <= m&&k <= a[i]; k++)                    c2[j + k] +=1* c1[j]/jc(k);//把第k项系数包含进去,如x^3/3!*x^2/2!            for (j = 0; j <= m; j++)            {                c1[j] = c2[j];                c2[j] = 0;            }        }        printf("%.0f\n", c1[m]*jc(m));    }    return 0;}