列表

详情


NC51165. 自然数拆分Lunatic版

描述

给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。求的结果。

输入描述

一个整数n。

输出描述

输出一个数,即所有方案数
因为这个数可能非常大,所以你只要输出这个数 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 \bmod 2147483648,即14

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 43ms, 内存消耗: 376K, 提交时间: 2019-11-03 19:37:31

#include <stdio.h>
unsigned int f[4001];
unsigned int p=2147483648;
int main()
{
    f[0]=1;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            f[j]=(f[j]+f[j-i])%p;
    printf("%u",f[n]>0?f[n]-1:p-1);
}

C++ 解法, 执行用时: 27ms, 内存消耗: 432K, 提交时间: 2021-08-28 16:49:32

#include<bits/stdc++.h>
using namespace std;
long long dp[4010],a,mod=2147483648;
int main(){
	dp[0]=1;
	scanf("%d",&a);
	for(int i=1;i<a;i++){
		for(int j=i;j<=a;j++){
			dp[j]=(dp[j-i]+dp[j])%mod;
		}
	}
	cout<<dp[a];
} 

上一题