指数型母函数

生成函数(母函数)有普通生成函数指数生成函数

1.普通生成函数用于解决多重集的组合问题

2.指数型母函数用于解决多重集的排列问题

普通型母函数

百度文库连接

问题:HDU1521

有n种物品,每种物品有ki件,从中选出m件的排列数

分析:

有n个元素,其中a1,a2,a3.....an互不相同,进行全排列,可得N!个不同的排列

若某一个元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的全排列数为\frac{n!}{ni!}  ,即其重复度为ni!

同理a1重复了n1次,a2重复了n2次......ak重复了nk次,n1+n2+n3.....+nk=n;

对于这样n个元素进行全排列,可得到不同排列的个数是  \frac{n!}{n1!*n2!*n3!.....nk!}  

若只对其中m个元素进行排列,就是指数型母函数

构造函数   G(x)=a0+\frac{a1}{1!}*x+\frac{a2}{2!}*x^{2}+\frac{a3}{3!}*x^{3}+\frac{a4}{4!}*x^{4}+\frac{a5}{5!}*x^{5}+.......+\frac{an}{n!}*x^{n}

称G(X)是数列a0,a1,a2,a3....an的指数型生成函数

以前讨论的母函数和指数母函数的差别,就在于前者直接用an作幂级数的系数,而后者则是用指数型母函数:hdu 1521 排列组合作为幂级数的系数,且真正有意义的就是an.

指数型母函数:hdu 1521 排列组合

总的说来,指数型母函数可以说是普通母函数的衍生,要注意的是两者间的区别,一个是系数,另一个是指数的变化。

好了,有了一定的母函数基础,加上指数型母函数的知识,就可以求这道题了,注意要用到double数组啦,考虑浮点数精度误差等问题。

c++

#include
#include
#include

using namespace std;

const int maxn=15;
double a[maxn],b[maxn];
int fact[maxn];
int num[maxn];
void init(){
    fact[0]=1;
    for(int i=1;i

Java

import java.util.*;
import java.math.*;

public class Main {
	static int maxn=15;
	static double[] a=new double[maxn];
	static double[] b=new double[maxn];
	static int[] num=new int[maxn];
	static int[] fact=new int[maxn];
	static void init() {
		for(int i=0;i

 

你可能感兴趣的:(指数型母函数)