TOJ:1746. How many sums

来源:互联网 发布:淘宝联盟部分退款返利 编辑:程序博客网 时间:2024/05/29 06:38

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 601using 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;}} 


 

0 0