生成函数初涉

 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+415 推广砝码任意个
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!) 

 

posted @ 2022-05-05 20:39  matt-11  阅读(38)  评论(0)    收藏  举报