将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] = dp[i-j][j] + dp[[i-j][j-1];
dp[i][j] 表示由j个数组成i。
dp[i-j][j]表示j个数组成i-j,将这j个数逐个加1,则组成i。
但这些组合里不包括1,因此用dp[i-j][j-1]的每个数逐个加1,得到i-1,再单独加上1。
350是因为n能包括的最多的数根据下式:
1+2+3+....+m = n -> (1+m)*m/2 = n -> m < sqrt(2n)。
#include <iostream>
#include <cstring>
using namespace std;
typedef long long int ll;
const int MOD = 1e9 + 7;
const int MAXN = 50000 + 50;
int dp[MAXN][350];
int main()
{
int n;
cin >> n;
dp[0][0] = 1;
for (int i = 1; i < 350; i++)
{
for (int j = i; j <= n; j++)
{
dp[j][i] = (dp[j - i][i] + dp[j - i][i - 1]) % MOD;
}
}
int result = 0;
for (int i = 1; i < 350; i++)
{
result = (result + dp[n][i]) % MOD;
}
cout << result << endl;
return 0;
}