背景
话说小小鱼看了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; }
时间: 2024-10-14 00:51:57