1 生成函数:
2 本质是组合的乘法原理
3 组合是普通生成函数,排列是带阶乘的,因为考虑多重排列
4
5 例如:
6 有1g,2g,3g,4g的砝码各一个,想要凑成7g砝码的方案数
7 思考:这个方案数肯定是a1+...+an这样凑的而这种加法可以映射回乘法
8 每个数都有取与不取,不取对乘法的贡献是1;
9 1g砝码可以看成:(1+x);
10 2g砝码可以看成:(1+x^2);
11 3g砝码可以看成:(1+x^3);
12 4g砝码可以看成:(1+x^4);
13 生成函数g(x)= (1+x)(1+x^2)(1+x^3)(1+x^4) = 1+x+x^2+...+2x^7+...+x^10;
14 说明凑成砝码为7的方案有两种3+4和1+2+4;
15 推广砝码任意个
16 g(x)=(1+x+x^2+..x^n)(1+x^2+..x^2n)(1+x^3+...x^3n)(1+x^4+...+x^4n)
17
18 介绍 1/(1-x)=∑x^n=1+x...+x^n;
19 证明:
20 f(x)= 1+x...+x^n;
21 xf(x)=x+...+x^n;
22 两式相减 f(x)= 1/(1-x);
23
24 (1-x)^(-k)=1+c(k,k-1)x+...+c(n+k-1,k-1)x^n+...+c(n+k-1,k-1)x^n;
25
26 证明;
27 1/(1-x)=1+x...+x^n;
28 两边对x求导k-1次
29 即(k-1)! * (1-x)^(-k) = ((k-1)*...*1)*1+(k*...2)x+...+..
30 两边除以(k-)1 !
31 即 (1-x)^(-k)=1+c(k,k-1)x+...+c(n+k-1,k-1)x^n+...+c(n+k-1,k-1)x^n;
32
33
34
35
36 #include<bits/stdc++.h>
37 using namespace std;
38 int a[20];
39 //g(x)=(1+x+x^2+x^3)(1+x^2+x^4+x^6+x^8)(1+x^4+x^8)
40 int main()
41 {
42 for(int i = 0; i <= 3; i++)
43 for(int j = 0; j <= 8; j += 2)
44 for(int k = 0; k <= 8; k += 4)
45 {
46 a[i + k + j]++;
47 }
48 for(int i = 0; i <= 20; i++)cout << "i " << a[i] << "\n";
49 return 0;
50 }
51
52 //多重组合
53 由八个元素,a1由3个,a2由2个,a3由3个,求c1...c8;
54 母函数g(x)=(1+x+x^2+x^3)(1+x+x^2)(1+x+x^2+x^3)
55
56 指数型母函数
57 n选k个的不重复排列 n!/k! 其中∑=k;即 n!/(p1!p2!...pn!),其中∑p=k;
58 若元素a1有n1个...ak有nk个
59 则生成函数g(x)= (1+ x/1!+...x^n1/n1!)...(1+ x/1!+...x^nk/nk!)