51Nod 1201-整数划分
将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。
Sample Input
6
Sample Output
4
解析:
1+2+3+...+n=50000,n最大316.
转移方程:dp[i][j] = dp[i-j][j] + dp[i-j][j-1]
dp[i-j][j]表示将i-j分成j份,然后每份加1,就成了dp[i][j]了,但这里划分都不包含没有1.
dp[i-j][j-1]表示将i-j分层j-1份,然后加上1份1,成dp[i][j],每个划分都包含了1.
ac:
#include<bits/stdc++.h>
#define mod 1000000007
#define MAXN 50005
#define ll long long
using namespace std;
ll dp[MAXN][400];
void build()
{
dp[1][1]=1;
for(int i=1;i<MAXN;i++)
{
for(in