hdu1028 Ignatius and the Princess III 生成函數

題目鏈接:傳送門

Problem Description
“Well, it seems the first problem is too easy. I will let you know how foolish you are later.” feng5166 says.

“The second problem is, given an positive integer N, we define an equation like this:
N=a[1]+a[2]+a[3]+…+a[m];
a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that “4 = 3 + 1” and “4 = 1 + 3” is the same in this problem. Now, you do it!”

Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.

Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.

生成函數
首先把每個位置的生成函數寫成1+x+x2+...+xn1+x+x^2+...+x^n是布星的qwq,因爲不考慮順序。
不考慮順序就想到把1有多少個,2有多少個(以此類推)寫成生成函數,即
F(n)=(1+x+x2+...+xn)(1+x2+x4+...+x2n)...(1+xn+...)F(n)=(1+x+x^2+...+x^n)(1+x^2+x^4+...+x^{2n})...(1+x^n+...)
這樣保證不管每個數取幾個,係數都是1,即保證了每種取法只算一次qwq。
因爲答案是xnx^n的係數,所以不考慮指數>n>n的情況,大莉跑dp即珂。

毒瘤代碼

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<vector>
#define re register int
#define mod 2004
using namespace std;
typedef long long ll;
int read() {
	re x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9') {
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9') {
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
inline void write(const int x) {
	if(x>9)	write(x/10);
	putchar(x%10+'0');
}
const int Size=205;
const int INF=0x3f3f3f3f;
int n,dp[Size][Size];
int main() {
	while(scanf("%d",&n)==1) {
		memset(dp,0,sizeof(dp));
		dp[0][0]=1;
		for(re i=1; i<=n; i++) {
			for(re j=0; j<=n; j++) {
				for(re k=0; j+k<=n; k+=i) {
					dp[i][j+k]+=dp[i-1][j];
				}
			}
		}
		printf("%d\n",dp[n][n]);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章