原題鏈接:HDU’s ACM 1028 Ignatius and the Princess III
分析:此爲母函數第一滴血,可參見母函數-Wikipedia。思路是轉換爲多項式乘法的結果,對應次方的係數表示該次方拆分的方法數,如f(3)=(1+x+x^2+x^3)*(1+x^2)*(1+x^3)=1+x+2x^2+6x^3+2x^4+3x^5+3x^6+x^7+x^8…
注意:可以參閱《程序設計中的組合數學》裏面有較爲詳細的介紹。喜歡的同學可以購買書籍學習。
<span style="font-family:Microsoft YaHei;font-size:14px;">#include <stdio.h>
#define MAXN 150
int coeff1[MAXN]; // 存儲係數,下標指示指數
int coeff2[MAXN];
int main()
{
int n;
int i, j, k;
while(scanf("%d", &n) == 1) {
for(i=0;i<=n;++i){
coeff1[i] = 1;
coeff2[i] = 0;
}
for(i=2;i<=n;++i) {
for(j=0;j<=n;++j) {
for(k=0;j+k<=n;k+=i) {
coeff2[j+k] += coeff1[j]; // coeff2做輔助存儲使用
}
}
for(j=0;j<=n;++j){
coeff1[j] = coeff2[j]; // 最終結果存儲在coeff1中
coeff2[j] = 0;
}
}
printf("%d\n", coeff1[n]);
}
return 0;
}</span>