題目鏈接:傳送門
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.
生成函數
首先把每個位置的生成函數寫成是布星的qwq,因爲不考慮順序。
不考慮順序就想到把1有多少個,2有多少個(以此類推)寫成生成函數,即
這樣保證不管每個數取幾個,係數都是1,即保證了每種取法只算一次qwq。
因爲答案是的係數,所以不考慮指數的情況,大莉跑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;
}