原题链接
将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种。由于数据较大,输出Mod 10^9 + 7的结果即可。
Input
输入1个数N(1 <= N <= 50000)。
Output
输出划分的数量Mod 10^9 + 7。
Input示例
6
Output示例
4
dp[i][j]表示把i分成j个不同的数的个数, dp[i][j] = dp[i-j][j] + dp[i-j][j-1];
前者表示将i - j划分为j个数,然后j个数都+1 还是不重复
后者表示将i - j划分为j - 1个数,然后j - 1个数都+1,再加上1这个数
#include <bits/stdc++.h>
#define maxn 50005
#define MOD 1000000007
using namespace std;
typedef long long ll;
int dp[50005][350];
int main(){
int n;
scanf("%d", &n);
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; (1+j)*j/2<= i; j++){
(dp[i][j] += (ll)dp[i-j][j] + dp[i-j][j-1]) %= MOD;
}
}
ll ans = 0;
for(int i = 1; (1 + i) * i / 2 <= n; i++){
(ans += dp[n][i]) %= MOD;
}
printf("%I64d\n", ans);
return 0;
}