母函式模板解釋

2021-07-11 20:42:00 字數 3481 閱讀 7676

母函式模板

1;母函式應用於——————形式上說,普通型生成函式用於解決多重集的組合問題,而指數型母函式用於解決多重集的排列問題.。現在我們先討論普通生成函式;

2;定義;

(1+x)^n = 1 + c(n,1)x +c(n,2)x^2 + c(n,3)x^3+~~~~~~~~~+c(n,n)^n;

==> g(x)=a0 + a1x + a2x^2 + ~~~~~ + anx^n;

函式g(x)就稱序列a0,a1,a2,a3~~~~~an的母函式;

看乙個經典的例子;

例一;

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

考慮用母函式來解決這個問題:

我們假設x表示砝碼,x的指數表示砝碼的重量,這樣:

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

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

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

1個4克的砝碼可以用函式1+x∧4表示

解釋;以1+x∧2為例;

2克的砝碼有兩種狀態,取or不取; 1*x^0+1*x^2;就是1+1*x^2;

看聯絡;g(x) = (1+x^1)(1+x^2)(1+x^3)*(1+x^4);每個括號內都表示每種砝碼的情況。

=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;

從最後面的式子可以知道;可以稱出1g到10g,前面的係數就是方案數。指數表示可以稱出的重量。

列如5g就找到x係數為5的式子;2*x^5係數為2則有2種方案可以稱出5g;

例二;

用1分,2分,3分的郵票可以貼出數值的方案數。

該例子對比例一的區別,這裡是無限的每種郵票都可以;1~無限。

*****==g(x)=(1+x+x^2+x^3+……)(1+x^2+x^4+x^6……)(1+x^3+x^6+x^9……)+( ……);

然後就是同樣的,

拆開後;前面的係數就是方案數。指數表示可以稱出的重量。

對於這種母函式的應用應該懂了吧。

個人理解;就是一句話,把每種列子的每種情況列出相乘就是要求的母函式了,母函式拆開之後就是結果了,冪表示情況,前面的係數表示該種情況下的方案種類;

現在我們考慮的是怎麼用**實現例二的情況呢。就是說我要怎麼用用**實現,輸入乙個數可以輸出這種重量的方案數。

一位大牛說,我們怎麼筆算的就用這種思維去實現,然而……還是不會。

先說一下核心思路吧。

**1;要開兩個陣列,c1,c2;

c1;儲存當前得到的多項式各式係數;

c2;儲存每次計算是的臨時結果;

並且在之後每計算一次完畢之後就要把c2賦值給c1,並且將c2初始化為0;

2;三重迴圈

第一重;記錄它正在與第幾個多項式相乘。

第二重;表示c1中每一項;

第三重;被後面相乘的每一項**。

在根據這些去落實**吧;

while(scanf("%d",&n) != eof)

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

}for(j = 0; j <= n; j++)

}printf("%d\n",c1[n]);

};

分析**;

1;

for(i = 0; i

<= n; i++)

初始化;這樣初始化的條件是每項都有從1到n克都存在的情況下,不能存在中間有一項沒有這種情況。

列如例子2082就是不能這樣的,他中間存在沒有的情況。

2;三重迴圈;

for(i = 2; i <= n; i++)//這裡的k表示表示式中的第k項,並且該項的冪是k*i;  

}for(j = 0; j <= 50; j++)

}

對比一下上個**;

區別;

1;初始化那裡不同,這裡只是c1[0]=1;而不是全部初始化為1;因此這樣的初始化適用範圍更廣,可以是連續的情況

2;第三重迴圈那裡不同,不再是k+=i;而是k++了。然而這裡的區別很大,。

這裡的k表示的是第i個表示式中的第k項,並且該項的冪是k*i**;

前面那個**k表示的是與第i個表示式中的冪為k的項相乘。

乙個表示k項乙個表示冪為k,這裡注意區分

模板介紹完了,應該對母函式這一概念和應用有了一定了解了吧?

來套模板刷幾道水題吧。

 現在hdoj_1028ignatius and the princess iii;

 就是整數的拆分;

就是跟模板一模一樣,直接上**吧;

#include

int c1[10000],c2[10000];

int main()

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

}for(j = 0; j <= n; j++)

}printf("%d\n",c1[n]);

}

return

0 ;}

繼續吧;

hdoj_1398 square coins

也是母函式題;注意題目的條件適當變化一下就ok了

#include

int c1[305],c2[305];

int main()

for(i = 2; i <= 17; i++)

}for(j = 0; j <= n; j++)

}printf("%d\n",c1[n]);

}return

0 ;}

看到變化沒,就是把第一重迴圈那裡變成從2到17;因為最大就是2^17;

還有就是第三重迴圈後面變成了k+=i*i;因為第i個表示式的冪變化的i*i變化的,題目中說了,正方形噠。

繼續來一道,要用後面那個模板的題吧。

hdu2082找單詞

這題是不是用模板一不行了。出現了可以不存在的情況,還有的是有界的並不是從0到無限,範圍是要輸入的,不多說,應該可以直接上**了。上面那個模板就是根據這題打的。

#include

#include

int x[27];

int c1[55],c2[55];

int main()

//這裡的k表示表示式中的第k項,並且該項的冪是k*i;

}for(j = 0; j <= 50; j++)

}for(i = 1; i <= 50; i++)

printf("%d\n",count);

}return

0 ;}

母函式模板

母函式,又稱生成函式,是acm競賽中經常使用的一種解題演算法,常用來解決組合方面的題目。本文講解母函式,但不講解該演算法的基礎理論。讀者隨便找一本組合數學教材便可找到相應的內容,或者直接在網上搜尋一下。母函式通常解決類似如下的問題 給5張1元,4張2元,3張5元,要得到15元,有多少種組合?某些時候...

母函式模板

研究以下多項式乘法 可以看出 x2項的係數a1a2 a1a3 an 1an中所有的項包括n個元素a1,a2,an中取兩個組合的全體 同理 x3項係數包含了從n個元素a1,a2,an中取3個元素組合的全體 以此類推。特例 若令a1 a2 an 1,在 8 1 式中a1a2 a1a3 an 1an項係數...

母函式模板核心

至 先理解乙個簡單的 母函式,又稱生成函式,是acm競賽中經常使用的一種解題演算法,常用來解決組合方面的題目。本文講解母函式,但不講解該演算法的基礎理論。讀者隨便找一本組合數學教材便可找到相應的內容,或者直接在網上搜尋一下。母函式通常解決類似如下的問題 給5張1元,4張2元,3張5元,要得到15元,...