母函式(思想而非套路)

2022-09-18 00:03:22 字數 1838 閱讀 6196

普通母函式:

可以用來求解一些組合數問題,例如最經典的x中砝碼可以構成重量為y方案數有多少?

普通的話窮舉所有的方案數是2^n的複雜度,指數級增長很快

但是利用母函式的話,可以轉換成乙個冪級數的乘積的形式,轉換方案見**,可以將複雜度降低到n^3,是乙個冪級數複雜度,遠低於指數級複雜度

題目如下:

/*

普通母函式:將離散數列的構造簡化為冪級數

例子:現在1g 3g 5g 9g 的砝碼各有無限個,問構成13g的方案數有多少

我們知道1g的可以選擇1個,2個,3個...13個 我們用x1 x2 x3...x13代表

3g的可以選擇1個,2個,3個,4個,我們用x3 x6 x9 x12代表

5g 9g 同理

下角標代表的是重量 前面的標號就是方案數

於是我們可以列出來算式就是(x1+x2+x3+x4+..+x13)*(x3+x6+x9+x12)*(x5+x10)*(x9)=...=a*x2+b*x5=a*b*x7

之後求13的方案數就是x13的係數

為什麼稱之為母函式呢 實際上是一種思想

就是一種將離線序列轉換為冪級數的方案

*/#include

#include

#include

#include

using

namespace

std;

intmaxx;

intn;

int a[100

];int sug[100]; ///

儲存每個值的係數

int tmp[100]; ///

儲存臨時結果

intmain()

memset(tmp ,

0 , sizeof

(tmp));

for(int i=0; i<=maxx; i+=a[1]) ///

從0開始因為可以不選這個

for(int i=2; i<=n; i++)

}for(int j=1; j<=maxx; j++)

}for(int i=1; i<=maxx; i++)

printf(

"%d..%d..\n

" , i , sug[i]); ///

輸出組成每種重量的方案數

}

return0;

}

指數型母函式:

用來求解多重集的排列問題

指數型母函式:(用來求解多重集的排列問題)

n個元素,其中a1,a2,····,an互不相同,進行全排列,可得n!個不同的排列。

若其中某一元素ai重複了ni次,全排列出來必有重複元素,其中真正不同的排列數應為 ,即其重複度為ni!

同理a1重複了n1次,a2重複了n2次,····,ak重複了nk次,n1+n2+····+nk=n。

對於這樣的n個元素進行全排列,可得不同排列的個數實際上是 

若只對其中的r個元素進行排列呢,那就用到了指數型母函式。

構造母函式g(x)=+則稱g(x)是數列a0,a1…an的指數型母函式。

一般過程:

1.建立模型:物品n種,每種數量分別為k1,k2,..kn個,求從中選出m個物品的排列方法數。

2.構造母函式:g(x)=(1+ + …+)(1+ ++…)…(1+ ++…)

=a0+a1·x+  ·  + · +… ·  (其中pp=k1+k2+k3…kn)

g(x)含義:ai為選出i個物品的排列方法數。

若題中有限定條件,只要把第i項出現的列在第i項的式中,未出現的不用列入式中。

如:物品i出現的次數為非0偶數,則原式改為…*(    +  +     )*…

感謝:

生成函式 母函式

根據定義,這個序列作為函式的係數,稱g x 就是序列的母函式。和一般意義上的函式相比,母函式的功能是計數。有這樣一道例題 到這一章為止,已知的計數法則就兩種,加法法則 或 和乘法法則 且 前者是分類思想,後者是分步。法1 分步來看,第乙個骰子有1 5種可能,因為兩個骰子之和是6,所以一旦第乙個骰子確...

生成函式(母函式)

參考部落格 在數學中,某個序列 a n 的母函式 又稱生成函式,英語 generating function 是一種形式冪級數,其每一項的係數可以提供關於這個序列的資訊。有三種物品,分別有 3 2,3個,問拿四個的方案數 f i j 表示當前第i個位置,已經選了j個物品的方案數 f 0 0 1 fo...

母函式 合集

hdu 1521 指數型母函式 hdu 2065 指數型母函式 hdu 2152 母函式 hdu 1709 母函式 hdu 1028 母函式 hdu 1171 母函式 hdu 1085 母函式 hdu 1398 母函式 hdu 1521 指數型母函式 include include include ...