hdu 1521 排列组合(指数型母函数)

来源:互联网 发布:微信外卖软件 编辑:程序博客网 时间:2024/05/10 04:32
求排列数的指数型母函数。 
ans=m!/(n1!*n2!*n3!……*nk!) 
    m 
其中∑ nk =m ,因为刚好选定m件物品。 
    k=1 
意思就是同一种物品无论怎么排列都只算做一种,所以当选某一件物品k次时就要 除以k! 

例如某一堆有3件物品 现在要取2件,那么排列数为2!,而事实上它2!种都是相同的,这也就是所谓的分组排列 

指数型母函数:http://www.wutianqi.com/?p=2644

#include<iostream>#include<cstdio>#include<cstring>using namespace std;double c1[10010],c2[10010];int facots(int n){    int ans=1;    for(int i=1;i<=n;i++)    {        ans*=i;    }    return ans;}int main(){    int n,m,i,j,k;    int a[20];    while(~scanf("%d%d",&n,&m))    {        memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        for(i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        for(i=0;i<=a[0];i++)        {            c1[i]=1.0/facots(i);        }        for(i=1;i<n;i++)        {            for(j=0;j<=m;j++)            {                for(k=0;k+j<=m&&k<=a[i];k++)                {                    c2[k+j]+=c1[j]/facots(k);//更新后一种物品,取了k件物品所以除以k!                }            }            for(j=0;j<=m;j++)            {                c1[j]=c2[j];                c2[j]=0;            }        }        printf("%.0lf\n",c1[m]*facots(m));//还原原来的系数    }    return 0;}


0 0