ACM暑假集訓

2021-10-09 05:06:55 字數 3339 閱讀 7963

出自–南昌理工學院acm集訓隊

什麼是母函式?

生成函式即母函式,是組合數學中尤其是計數方面的乙個重要理論和工具。

完全看不懂,話說要不因為做了杭電的1028,完全不會去用,好像母函式還有這幾種來著,l級數、貝爾級數和狄利克雷級數

這裡我就說說普通母函式吧(其他的我也不懂 )

母函式的思想很簡單—就是把離散數列和冪級數一一對應起來,把離散數列間的相互結合關係對應成為冪級數間的運算關係,最後由冪級數形式來確定離散數列的構造。(還是太玄乎了)

上例題 上才藝

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

拿列舉的話,我們來看看列舉的過程,對於每乙個砝碼來說有拿和不拿兩種結果,所以總的結果為2 * 2* 2 * 2=16種

那列舉的結果呢?我們可以看到有:

一種:0g,1g,2g,3g,8g,9g,10g

兩種:3g,4g,5g,6g,7g

我們來對前兩個砝碼的使用情況舉個栗子對於一來說:使用1g或者不使用1g

對於二來說:使用2g或者不使用2g

那總的方案數,根據乘法原理來說就可以寫成

(使用1g+不使用1g)*(使用2g + 不使用2g)

看到這裡我們不禁想說出我們今天要說的內容了 那有沒有什麼這樣一種運算關係,以乘法的形式運算,但是結果表現出類似於加法的關係呢?正好有乙個,那就是冪運算。x ^ n 乘上 x ^ m 結果是x ^ m+n,他完美的符合了我們的要求。那麼以次數表示砝碼的質量, 就可以以多項式的形式表示砝碼組合的所有方案。

那我們對上面的方案來說就可以寫成(一般由於x ^ 0=1的緣故,所以會寫成1+…,但是在這裡為了便於理解寫成x ^ 0)

(x ^ 0+x ^ 1)*(x ^ 0+x ^ 2)

=x ^ 0 * x ^ 0+x ^ 0 * x ^ 2+x ^ 1 * x ^ 0+x ^ 1*x ^ 2

=x ^ 0+ x ^ 1+x ^ 2+x ^ 3

所以很明顯,有四種方案,分別是0g,1g,2g,3g,這與我們的列舉結果一致,我大膽假設一下結果中有相同的項,那麼合併同類項後每一項的係數就是這種重量有幾種實現方案

接下來我們來寫一下三個砝碼的過程情況

(x ^ 0+x ^ 1)* (x ^ 0+x ^ 2) * (x ^ 0+x ^ 3)

=(x ^ 0+ x ^ 1+x ^ 2+x ^ 3) * (x ^ 0+x ^ 3)

=x ^ 0+ x ^ 1+x ^ 2+x ^ 3+x ^ 4+x ^ 5

我們在來看四個砝碼的情況(才不是因為麼有看到係數的變化)

(x ^ 0+x ^ 1)* (x ^ 0+x ^ 2) * (x ^ 0+x ^ 3) *(x ^ 0+x ^ 4)

=(x ^ 0+ x ^ 1+x ^ 2+x ^ 3+x ^ 4+x ^ 5) * (x ^ 0+x ^ 4)

=x ^ 0 + x ^ 1 + x ^ 2 + 2x ^ 3 + 2x ^ 4 + 2x ^ 5 + 2x ^ 6 + 2*x ^ 7 + x ^ 8+ x ^ 9 + x ^ 10

根據列舉的結果我們可以得出我們的結論次數代表組合後可稱出的質量,係數代表組合出這種質量的方案的數量。(太難了) 與我們的假設一致,這就是母函式啦(撒花撒花)

接下來我們在把問題昇華一下

求用1g、2g、3g的砝碼稱出不同重量的方案數 。(這是什麼鬼,不是和上面的一樣的嗎?)

對於第一題來說我們1g的只有乙個,2g也一樣(對每一種的砝碼都只有乙個),對於第二題來說每一種都是無限多的

於是問題誕生了這樣的母函式該怎麼寫呢?我們來看,因為我們有無數個砝碼,就拿1g的砝碼和2g的砝碼來舉例,我們把2個1g的砝碼看成是2g的,3個1g砝碼看成是3g的,同理2g的砝碼,我們可以把2個2g看成是4g的砝碼,3個2g看出是6g的砝碼,這樣就可以推出把m個n g砝碼看成是乙個n * m g砝碼,所以母函式可以寫成

(x ^ 0+x ^ 1 + x ^ 2 + x ^ 3 + x ^ 4 + x ^ 5 + …… ) * (x ^ 0 + x ^ 2 + x ^ 4 + x ^ 6 + x ^ 8+ x ^ 10 + ……)

又又又有問題來了,那這不是無限多嗎?題目怎麼寫?這個問題其實很好解決,因為題目自己會限定條件啦

來個栗子

那麼如果題目是求用1g、2g、3g的砝碼稱出10g的方案數 。

表示式就是:

(x ^ 0 +x ^ 1 + x ^ 2 + x ^ 3 + x ^ 4 + x ^ 5 + ……x ^ 10 )*(x0 + x2 + x4 + x6 + x8+ x10 )

結果就是合併同類項後x10的係數。

用1g、2g、3g的砝碼稱出10g的方案數,本應該有三組表示式,但是1克和2克中已經完全包含3的所有倍數了,可以不寫了

例題hdu1028

大佬的母函式模板和認識

#include

#include

#include

#define endl '\n'

#define io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e6+20;

const ll mod =

998244353

;int a[maxn]

;inline ll read()

while

(ch >=

'0'&& ch <=

'9')

return val * f;

}inline

void

prints

(ll val)

if(val >9)

prints

(val /10)

;putchar

(val %10+

'0');}

int a1[

125]

,a2[

125]

;int

main()

for(i=

2;i<=n;

++i)

//求第i個表示式(1+x^(k+i)+x^(k+2i)+x^(k+3i)+...)

// 每次前i個表示式累乘求完後都把中間變數a2賦值給a1

for(j=

0;j<=n;

++j)

}printf

("%d\n"

,a1[n]);

}return0;

}

ACM暑假留校集訓總結

b汗 最初寫這東西竟然還是為了打發實踐報告 不過真的有好多想寫的 大一剛入校便通過學長知道了這個比賽,這個社團。起初搞acm的打算也是為了大一做一些有意義的事情,莫讓光陰虛度。一年的c c 的學習也讓我初步了解了程式設計的世界,養成了一些演算法思路,亦或者稱之為素質的東西,我想這些東西對我以後的學習...

ACM暑假集訓總結3

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。就是數學中的二分法一樣的思想 int find int x 二分查詢 if a l x return l 找都了就輸出他的位置 else retu...

大一暑假acm集訓總結

整整乙個月的acm集訓終於結束了。放鬆。頭一次早晨睡到9點,滿足。趁熱乎,寫一下總結吧。學習了兩個星期,差不多算是把譚浩強的c語言書又過了一遍吧,比較新奇的是用的os x系統的xcode軟體學的,感覺這個系統挺適合學習工作的,因為沒啥遊戲玩。因為我之前就把c語言學的差不多了 其實也很簡單,課本上所有...