【题解】CH5202 自然数拆分Lunatic版 完全背包

题目链接

描述

给定一个自然数 N N N,要求把 N N N 拆分成若干个正整数相加的形式,参与加法运算的数可以重复。求拆分的方案数 m o d    2147483648 \mod 2147483648 mod2147483648 的结果。 1 ≤ N ≤ 4000 1≤N≤4000 1N4000

输入格式

一个整数 n n n

输出格式

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

样例输入

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 14 种情况,所以输出 14 m o d    2147483648 14 \mod 2147483648 14mod2147483648,即 14 14 14


完全背包

#include
typedef long long ll;
ll mod=2147483648;
ll f[4010];
int main()
{
	int n;
	scanf("%d",&n);
	f[0]=1;
	for(int i=1;i<=n;i++)
	    for(int j=i;j<=n;j++)
	        f[j]=(f[j]+f[j-i])%mod;
	printf("%lld\n",(f[n]-1+mod)%mod);
	return 0;
}

总结

你可能感兴趣的:(算法竞赛进阶指南,Contest,Hunter,背包问题)