HDU's ACM 1028 Ignatius and the Princess III

原題鏈接: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>

点赞