在數學中,某個序列的母函式(generating function,又稱生成函式)是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。使用母函式解決問題的方法稱為母函式方法。
先看兩個例子:
第一種:
有1克、2克、3克、4克的砝碼各一枚,能稱出哪幾種重量?每種重量各有幾種可能方案?
考慮用母函式來解決這個問題:
我們假設x表示砝碼,x的指數表示砝碼的重量,這樣:
1個1克的砝碼可以用函式1+1*x^1表示,我們拿1+x^2來說,前面已經說過,x表示砝碼,x的指數表示砝碼的重量!初始狀態時,這裡就是乙個質量為2的砝碼。1個2克的砝碼可以用函式1+1*x^2表示,
1個3克的砝碼可以用函式1+1*x^3表示,
1個4克的砝碼可以用函式1+1*x^4表示,
這裡1+1*x^2 = 1*x^0 + 1*x^2,即表示2克的砝碼有兩種狀態,不取或取,不取則為1*x^0,取則為1*x^2
這裡的係數表示狀態數(方案數),而指數則相當於這個東西的權重(即價值)。
1+x^2,也就是1*x^0 + 1*x^2,也就是上面說的不取2克砝碼,此時有1種狀態;或者取2克砝碼,此時也有1種狀態。
幾種砝碼的組合可以稱重的情況,可以用以上幾個函式的乘積表示:
(1+x)(1+x^2)(1+x^3)(1+x^4)
=(1+x+x^2+x^4)(1+x^3+^4+x^7)
=1 + x + x^2 + 2*x^3 + 2*x^4 + 2*x^5 + 2*x^6 + 2*x^7 + x^8 + x^9 + x^10
從上面的函式知道:可稱出從1克到10克,係數便是方案數。
第二種:
求用1分、2分、3分的郵票貼出不同數值的方案數:
大家把這種情況和第一種比較有何區別?第一種每種是乙個,而這裡每種是無限的。
故g(x)=(1+x^1+x^2+....)(1+x^2+x^4+....)....(1+x^n+x^2n+....)....
這裡是乙個整數劃分方案個數的模板,計算的方法是模擬手算,從前向後乙個接乙個的括號計算:
#includeusing namespace std;
int c1[10001], c2[10001], n; //n是要被劃分的整數,c1是用來存放展開式的各項係數,c2用來計算時臨時儲存的
int main()
for (int i = 2; i <= n; i++) //計算從第二個括號表示式開始
for (int i = 0; i <= n; i++) //更新一下資料,開始下乙個括號表示式的計算
}cout << c1[n] << endl; //輸出指數為n的項的係數是多少,則有多少種劃分
} return 0;
}
板子題目:
題目:
#include#includeusing namespace std;
int num1, num2, num3;
int vis[10000];
int main()
} for (int i = 0; i <= num3 * 5; i += 5) //計算第三個
}int i;
for (i = 1; i <= num1 + num2 * 2 + num3 * 5; i++)
}printf("%d\n", i);
} return 0;
}
母函式問題
母函式可分為很多種,包括普通母函式 指數母函式 l級數 貝爾級數和狄利克雷級數。對每個序列都可以寫出以上每個型別的乙個母函式。構造母函式的目的一般是為了解決某個特定的問題,因此選用何種母函式視乎序列本身的特性和問題的型別。我們首先來看下這個多項式乘法 由此可以看出 1.x的係數是a1,a 2,a n...
母函式問題
首先說下母函式定義 生成函式即母函式,是組合數學中尤其是計數方面的乙個重要理論和工具。生成函式有普通型生成函式和指數型生成函式兩種,其中普通型用的比較多。形式上說,普通型生成函式用於解決多重集的組合問題,而指數型母函式用於解決多重集的排列問題。母函式還可以解決遞迴數列的通項問題 例如使用母函式解決斐...
ACM 母函式問題模板
include using namespace std const int lmax 10000 int c1 lmax 1 c2 lmax 1 c1是儲存各項質量砝碼可以組合的數目 c2是中間量,儲存每一次的情況 int main 初始化 for i 0 i n i c1 i 1 首先對c1,第乙...