http://acm.tju.edu.cn/toj/showp1746.html
开始的时候没有想到会是大数,用了unsigned long long 然后就发现,数据范围不够,输出有负值,所以只能用数组处理,开始的时候用的是longlong 到100位了,后来才发现最多只有24位,8 * 4 就可以了。
#include <iostream>
#include <cstring>
#include <cstdio>
#define Base 1e8
#define MAXN 601
using namespace std;
int dp[MAXN][MAXN][4];
void make()
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= 600; i++)
{
dp[i][1][0] = 1;
for (int j = 2; j <= 600; j++)
{
if (i > j)
{
for (int k = 0; k < 4; k++)
dp[i][j][k] = dp[i][j - 1][k] + dp[i - j][j][k];
}
else if (i == j)
{
for (int k = 0; k < 4; k++)
dp[i][j][k] = dp[i][j - 1][k];
dp[i][j][0]++;
}
else
{
for (int k = 0; k < 4; k++)
dp[i][j][k] = dp[i][i][k];
}
for (int k = 0; k < 3; k++)
if (dp[i][j][k] >= Base)
dp[i][j][k] -= Base, dp[i][j][k + 1]++;
}
}
}
int main()
{
int n;
make();
while (cin >> n, n)
{
int flag = 0;
for (int i = 3; i >= 0; i--)
{
if (dp[n][n][i]) flag++;
if (flag == 1) cout << dp[n][n][i];
else if (flag > 1)
printf("%08d", dp[n][n][i]);
}
cout << endl;
}
}