tyvj1172 自然数拆分Lunatic版

背景

话说小小鱼看了P1171(自然数拆分)之后感觉异常不爽,于是异常邪恶地将题目加强。

描述

输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。

输入格式

输入只有一个整数n,表示待拆分的自然数n。 0<n<=4000
PS:0也算自然数,所以这里应该写正整数比较好
但是为了尊重原作者的版权(这有版权吗- -),没有改掉。
本来n是要到5000的,但是开到5000的话我的程序就Memory Limit Exceeded了。。

输出格式

输出一个数,即所有方案数
因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。

测试样例1

输入

7

输出

14

备注

解释:
输入7,则7拆分的结果是
7=1+6
7=1+1+5
7=1+1+1+4
7=1+1+1+1+3
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
7=1+1+1+2+2
7=1+1+2+3
7=1+2+4
7=1+2+2+2
7=1+3+3
7=2+5
7=2+2+3
7=3+4


一共有14种情况,所以输出14 mod 2147483648,即14小小鱼加强Admin的P1171
PS:虽说加强了,但是好像还是很简单。。。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
unsigned int n,dp[4005][4005],ans,mod = 2147483648;
int main(){
    cin>>n;
    dp[0][0] = 1;
    for(int i = 1;i <= n;i++){
        for(int j = i;j <= n;j++){
            dp[i][j] = (dp[i-1][j-1] + dp[i][j-i]) % mod;
            if(i > 1 && j == n) ans = (ans + dp[i][j]) % mod;
        }
    }
    cout<<ans;
    return 0;
}

 

posted @ 2016-08-09 21:33  ACforever  阅读(324)  评论(0编辑  收藏  举报