母函式模板
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元,...