HDU 1521(排列组合)

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

 

分析:指数型生成函数裸题。(不明白的可以先去看一下这个知识点)

设第 i 种物品的数量为 cnt[i-1], 根据题意可以设式如下:

G(x)=\prod_{i=0}^{n-1}(1+x+\frac{x^{2}}{2!}+...+\frac{x^{cnt[i]]}}{cnt[i]]!});   

则最终 x^{m} 的系数就是所求的方案数(这真的没什么好解释的,明白指数型生成函数概念的不用想就直接知道了)。

然后直接模拟算一遍就可以了,数据范围不大,也没什么坑点,细心一点就好了!

 

代码:

#include
#include
#include
using namespace std;

typedef long long ll;

int main()
{
	ll fac[11]={1};
	for(int i=1;i<=10;i++) fac[i]=fac[i-1]*i;
	
	int cnt[11];
	double a[11],b[11];
	int n,m;
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=0;i

 

 

你可能感兴趣的:(生成函数)