1. 程式人生 > >普通型母函式和指數型母函式

普通型母函式和指數型母函式

母函式:摘自百度百科

生成函式即母函式,是組合數學中尤其是計數方面的一個重要理論和工具。生成函式有普通型生成函式和指數型生成函式兩種,其中普通型用的比較多。形式上說,普通型生成函式用於解決多重集的組合問題,而指數型母函式用於解決多重集的排列問題。母函式還可以解決遞迴數列的通項問題(例如使用母函式解決斐波那契數列的通項公式)

理解:

什麼是普通母函式呢,——把組合問題的加法法則和冪級數的的乘冪的相加對應起來,這句話可能一開始難以理解,不過其實學完了之後很容易理解,母函式的思想很簡單—就是把離散數列和冪級數一一對應起來,把離散數列間的相互結合關係對應成為冪級數間的運算關係,最後由冪級數形式來確定離散數列的構造。

        普通型母函式主要是來求組合的方案數,而指數型母函式是求多重排列數

普通母函式:

定義

若函式G(x)=a0+a1*x+a2*x^2+……+an*x^n,則稱函式G(x)為序列a0、a1、a2、……an的母函式。

例如:(1+x)^n=1+C(n,1)*x+C(n,2)*x^2+……+C(n,n)*x^n 就是序列 C(n,1)、C(n,2)、……、C(n,n)的母函式,其中C(n,m)為組合數。

經典例題

有質量為1,2,4的砝碼分別為1,3,2枚,問:

1.可以稱出多少種不同的質量?

2.要稱出質量為3的物品,有幾種可能的方式?

則可以建構函式G(x) = (1+x)*(1+x^2+x^4+x^6)*(1+x^4+x^8),其中第一個括號中的1表示質量為1的砝碼用了0枚,x表示質量為1的砝碼用了1枚;第二個括號中的1表示質量為2的砝碼用了0枚,x^2為質量為2的砝碼用了1枚,x^4表示質量為2的砝碼用了2枚,也就是x^(2*2),x^6表示質量為2的砝碼用了3枚,也就是x^(2*3)。先不必理解為什麼這樣做,只需要知道怎樣做。

總結一下,每個括號就表示一種砝碼的使用情況。x^n就表示質量為n的砝碼用了1枚。最少可以使用0枚,也就是式子裡面的1。最多可以使用m枚,也就是x^(n*m)。

知道了對應關係,那麼程式碼應該怎麼寫呢?其實也簡單,就是模擬手動計算以上多項式相乘的過程。比如上面的

G(x) = (1+x)*(1+x^2+x^4+x^6)*(1+x^4+x^8)

= (1+x^2+x^4+x^6  + x+x^3+x^5+x^7)*(1+x^4+x^8)

= (1+x+x^2+x^3+x^4+x^5+x^6+x^7)*(1+x^4+x^8)

= (1+x+x^2+x^3+x^4+x^5+x^6+x^7  +  x^4+x^5+x^6+x^7+x^8+x^9+x^10+x^11  +  x^8+x^9+x^10+x^11+x^12+x^13+x^14+x^15)

=1+x+x^2+x^3+2*x^4+2*x^5+2*x^6+2*x^7+2*x^8+2*x^9+2*x^10+2*x^11+x^12+x^13+x^14+x^15

以上過程也就是不斷的計算前 i 個多項式相乘的結果。最後得到的式子中 m*x^n 就表示可以有m種方式稱出質量為n的物品。一共有x~x^15個不同的質量,也就是最多能稱出15中不同質量的物品


#define MAXN 55

int a[MAXN],b[MAXN];

int s[MAXN],e[MAXN],v[MAXN];

 

void mu(int n)

{ //n為因子個數 

	int i,j,k;

	memset(a,0,sizeof(a));

	a[0]=1;

	for(i=1;i<=n;i++)

	{ //前i項相乘 

		memset(b,0,sizeof(b));

		//j為第i種物品可能的數量,j*v[i]即第i個括號中第j項的係數

		for(j=s[i];j<=e[i]&&j*v[i]<=MAXN;j++)

			for(k=0;k+j*v[i]<=MAXN;k++) //計算對前i-1項相乘的結果的第k項的係數產生的影響 

				b[k+j*v[i]]+=a[k];

		memcpy(a,b,sizeof(b)); //將b陣列存回a陣列 

	}	

}

以上程式碼中MAXN為結果可能生成的x的指數的最大值。

a陣列儲存最終結果,b陣列儲存中間結果
s[i] (start陣列)為第i個變數的最小個數,一般都為0,e[i] (end陣列)為第i個變數的最大個數
v[i]表示第i個未知量的取值,即x^v[i]
a[i]儲存的是未知量 x^i 前面的係數

也就是a儲存前i-1項的相乘結果,然後遍歷第i項中的每一個變數,讓其與a中的每一項相乘,將結果臨時儲存到b陣列中,最後存回a陣列。

例如:求不同個數的不同質量的砝碼可以組成的質量為 i 的種類數
v[i]存第i種砝碼質量,s[i]存第i種砝碼最小的個數,e[i]存第i種砝碼最大的個數,a[i]存可以組成的質量為i的種類數、

指數函式: