#include <iostream>
using namespace std;
typedef long long ll;
ll dpPreffix[107][1007];
ll dpSuffix[107][1007];
int N, K;
void input()
{
scanf("%d%d", &N, &K);
}
void init()
{
for (int i = 0; i <= K; i++)
{
dpSuffix[i][0] = 1LL;
}
for (int i = 0; i <= K; i++)
{
for (int j = 0; j <= N; j++)
{
dpPreffix[i][j] = 0LL;
}
}
}
void doDp()
{
for (int i = 1; i <= K; i++)
{
for (int j = 1; j <= N; j++)
{
if (i == 1)
{
dpSuffix[i][j] = 1LL;
}
else
{
if (j >= i)
{
ll val = dpSuffix[i - 1][j] + dpSuffix[i][j - i];
dpPreffix[i][j] += dpPreffix[i - 1][j];
dpPreffix[i][j] += dpPreffix[i][j - i];
// 我用Java算过,最大的结果是15658181104580771094597751280645
if (val > 10000000000000000LL)
{
dpSuffix[i][j] = val % 10000000000000000LL;
dpPreffix[i][j] += (val / 10000000000000000LL);
}
else
{
dpSuffix[i][j] = val;
}
}
else
{
dpPreffix[i][j] = dpPreffix[i - 1][j];
dpSuffix[i][j] = dpSuffix[i - 1][j];
}
}
}
}
}
void output()
{
if (dpPreffix[K][N] > 0LL)
{
printf("%lld", dpPreffix[K][N]);
}
printf("%lld\n", dpSuffix[K][N]);
}
int main()
{
input();
init();
doDp();
output();
return 0;
}
POJ 3181 动态规划,排列组合,大整数处理
最新推荐文章于 2024-08-05 20:49:33 发布