POJ3181 Dollar Dayz

来源:互联网 发布:pc端护眼软件 编辑:程序博客网 时间:2024/04/30 21:50
/*2016年8月2日19:53:39  题目大意:输入n,和k,问将n用1到k这k个数字进行拆分,有多少种拆分方法。例如:n=5,k=3 则有n=3+2,n=3+1+1,n=2+1+1+1,n=2+2+1,n=1+1+1+1+1这5种拆分方法思路详见 代码n只要大一点就会爆longlong 所以要用大数但最大数字有33位 ( 网上说的 所以可以用两个long long 分开表示一个表示后18位 另一个表示前面的位 */#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <cmath>#include <stack>#include <map>#include <set>#define pi acos(-1)#define LL long long#define INF 0x3f3f3f3fusing namespace std;const int maxn = 1e5 + 5;const LL mod = 1e18;LL dp[1005], a[1005];int main(void){//freopen("C:\\Users\\wave\\Desktop\\NULL.exe\\NULL\\in.txt","r", stdin);    int i, j, n, k;    LL tmp;    while (cin >> n >> k)    {        memset(dp, 0, sizeof(dp));        memset(a, 0, sizeof(a));        dp[0] = 1;        for (i = 1; i <= k; i++){  // 当i = 1 表示只用硬币1来组成 j的方法数            for (j = i; j <= n; j++){// 当i = 2 表示只用硬币1和2来组成 j的方法数                 a[j] = a[j] + a[j-i] + (dp[j] + dp[j-i]) / mod;// 当i = 3 表示只用硬币1和2和3来组成 j的方法数                 dp[j] = (dp[j] + dp[j-i]) % mod;///  等等等等。。。。  所以就 dp[j] += dp[j-i]              }        }        if (a[n]) cout << a[n];        cout << dp[n] << endl;    }    return 0;}

0 0