演算法學習 母函式

2021-08-27 20:39:35 字數 2847 閱讀 8502

母函式又稱生成函式。定義是給出序列:a0,a1,a2,.......ak,......,那麼函式g(x)=a0+a1*x+a2*x2+......ak*xk稱為序列a0,a1,a2,.......ak,......的母函式(即生成函式)。

特別的當序列為:1,1,1,1,.......1,這個生成函式為:g(x)=x+x2+x3+.......+xn=(1-xn)/(1-x),當-11/(1-x)n=1+c(n,1)x+c(n+1,2)x2+c(n+2,3)x3+...+c(n+k-1,k)xk+...可以把生成函式還原為數列。

例 1:使用母函式求出斐波那契數列的通項公式。fib(n)=fib(n-1)+fib(n-2),這裡假設fib(1)=1,fib(2)=1;

求解這種遞推關係的方法是:①、將遞推關係變成母函式方程;②、求解母函式方程;③、將母函式變成冪級數形式。

所以斐波那契數列的生成函式為:g(x)=x+x2+2x3+3x4+5x5+8x6..........。

等式兩邊同時*x有:xg(x)=x2+x3+2x4+3x5+5x6+8x7+.......。

相加有:g(x)+xg(x)=x+2x2+3x3+5x4+8x5+13x6+........。

我們對比g(x)可以得到:g(x)+xg(x)=g(x)/x-1;所以我們可以得到:g(x)=x/(1-x-x2)。

可以令:1-x-x2=0,得到兩根為:a=(1-√5)/2,b=(1+√5)/2,所以我們可以知道:1-x-x2=(x-x1)(x-x2)=(1-ax)(1-bx);

假設x/(1-x-x2)=m/(1-ax)+n/(1-bx),通分有:x=m(1-bx)+n(1-ax).由係數關係可得m=-1/√5,n=1/√5,所以g(x)=-1/√5(1-bx)+1/√5(1-ax)。

我們可知:1/(1-bx)=1/[1-(1+√5)/2x]是以公比為(1+√5)/2的等比數列,1/(1-ax)是以公比為(1-√5)/2的等比數列,所以其通項公式為:fib(n)=1/√5[bn+1-an+1]。

例題2:若有1克、2克、3克、4克的砝碼各一 枚,能稱出哪幾種重量?各有幾種可能方案?

構造母函式,如果用x的指數表示稱出的重量,則:

1個1克的砝碼可以用函式1+x表示,(前面的這個1表示1克的砝碼個數為0)

1個2克的砝碼可以用函式1+x2表示,

1個3克的砝碼可以用函式1+x3表示,

1個4克的砝碼可以用函式1+x4表示,

那麼幾種砝碼的組合情況的用乘積表示有:(1+x)(1+x2)(1+x3)(1+x4)=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10 ,係數即為方案數。

例稱出重量為6的物品:①、1,2,3;②、2,4兩種方案。

例題3:求用1分、2分、3分的郵票貼出不同數值的方案數?

這個相對於上面的那個例子是:這個郵票可以重複。可知其生成函式為:g(x)=(1+x+x2+....)(1+x2+x4+....)(1+x3+x6+...),同理展開後其係數即為方案數。

例題4:德.梅其里亞克稱重問題

(1)重為a1,a2,a3.....ak的砝碼,如何放在天平的兩端,記可稱重量為n的物體的不同方式為cn,則cn的母函式為:

g(x)=(x-a1+1+xa1)(x-a2+1+xa2).........(x-ak+1+xak) ------ x-a1表示砝碼a1和物體放在同乙個托盤內,xa1表示砝碼和物體放在不同的托盤內,1則為不用這個砝碼。

(2)重為a1,a2,a3....ak的砝碼,如只可以放在天平的一端,記可稱重量為n的物體的不同方式為cn,則cn的母函式為:

g(x)=(1+xa1)(1+xa2).........(1+xak)

假設1出現的次數為記為a1,2出現的次數記為a2.........k出現的次數記為ak,那麼生成函式為:

g(x)=(1+x+x2+x3+x4+.....)(1+x2+x4+x6+x8+......)(1+x3+x6+x9+....)........(1+xn)

前面的1+x2+x4+x6+x8+......意思是當出現乙個2時為x2,當出現兩個2時為x4.....,為什麼當出現n時,只有兩項(1+xn),因為是將數n劃分為若干項,所以不能超過該數,且由數1到n項數依次要<=n/k(k=1.2,3,4...n)。

還是以nyist 90(數的劃分)為例:這裡就直接套用網上的模板了

#include#include#includeusing namespace std;  

const int max=50;

#define clr(arr,val) memset(arr,val,sizeof(arr))

int n,m,value[max],temp[max];

int main()

cout例題2:hdu 1085(硬幣問題)

//有3種面額是1、2、5的硬幣,輸入3個數字代表每種硬幣的枚數,求最小的不能由這些硬幣組成的面額是多少?

#include#include#includeusing namespace std;

const int max=8010;

#define clr(arr,val) memset(arr,val,sizeof(arr))

int value[max],temp[max],num[3],coin[3]=;

int main()

for(i=0;i<=max+1;i++)//遍歷即可

if(value[i]==0) {cout涉及到母函式的題目有:hdu 1171,1398,1709,2065,2069,2082,2152;poj 3046,3716,3734等等~有空再做下

**

學習母函式感慨

對於母函式剛開始的時候筆者也覺得這實在是太難啊,但是在我靜下心來的時候開始看的時候才發現原來是這麼簡單啊 對於母函式一般可分為普通型母函式和指數型母函式這兩種型別 普通型母函式形式 f x a0 a1x a2x 2 anx n 指數型母函式形式 f x a0 a1 x 1 a2 x 2 2 an x...

深度解析母函式演算法

在數學中,某個序列 an n n 的母函式 又稱生成函式,英語 generating function 是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。使用母函式解決問題的方法稱為母函式方法。母函式可分為很多種,包括普通母函式 指數母函式 l級數 貝爾級數和狄利克雷級數。對每個序列都可以...

演算法函式 演算法學習筆記 18 尤拉函式

數論中的尤拉函式 對於尤拉函式,主要有如下性質 我們來證明第乙個性質 在不大於 不與之互質的只有 至於第二個性質,設那 第三個性質的證明需要用到複雜一些的數論知識,這裡不證了,可參見這篇部落格。符合這種性質的數論函式稱為積性函式。我們把正整數質因數分解 所有 兩兩互質,由尤拉函式的性質有 即 用這個...