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;
}
时间: 2024-10-14 00:51:57

tyvj1172 自然数拆分Lunatic版的相关文章

TYVJ1172 自然数拆分Lunatic版 - 背包DP[完全背包]

TYVJ1172 自然数拆分Lunatic版 传送门 思路: 类比TYVJ1096 数字组合 , 本题的数字可以重复使用,所以是一个完全背包模型.\(f[i,j]\)表示当前选到第\(i\)类数字凑成的数字为\(j\)的方案数. Tips: 1.模数为\(2^64\),需要用\(unsigned~long~long\)存储,所以\(f\)数组也要用\(unsigned~long~long\)存储. 2.因为是自然数拆分,所以最终答案减去凑成0的方案数. AC Code: #include<cst

题解【AcWing279】自然数拆分

题解[AcWing279]自然数拆分 标签(空格分隔): DP 背包 题面 因为题目中说参与加法运算的数可以重复,由此可以想到完全背包计数问题. 完全背包计数问题与 \(01\) 背包计数问题只有一个不同: \(01\) 背包计数问题的第二维循环是倒叙循环,而完全背包计数问题的第二维循环是正序循环. 这涉及到的是循环时后效性的问题,具体的证明留给读者思考. 注意每一步计数都要取模,且最后输出要减去只有 \(n\) 一个数的一组解. #include <bits/stdc++.h> #defin

排列和组合

排列和组合在我们高中的时候是最熟悉不过的数学词了,接下来找找这方面的题目供大家思考 (1)爬楼梯 一个楼梯有50个台阶,每一步可以走一个台阶,也可以走两个台阶,请问走完这个楼梯共有多少种方法? (2)铺砖头 有一个长度为n,宽度为2的地面,有若干块长为2,宽为1的地砖,请问用此地砖铺完这个地面共有多少种方法? (3)自然数拆分 给定一个自然数n,将其拆分为若干个自然数字之和,请问有多少种方法? (4)1分2分和5分多少种组合一角的方法 (5)放苹果

SGU - 282

SGU - 282 题意: 本质不同的集合:不存在两个方案重新编号之后对应的边集相同(对于所有x,y,,(x,y)边颜色都相同). (1≤ N≤ 53, 1≤ M≤ 1000) 对P取模 本质不同,想到置换 置换在哪里? 就是重新编号 本质是一个n!大小的置换群 不能枚举每一个置换了,考虑对相同的置换一起处理 置换之后也要找环,所以直接枚举环的情况,处理对应这种环的组合的置换的出现次数,再处理环的组合的不动点 自然数拆分出环 环长为li,有k个,对应置换个数: $\frac{n!}{(l1!*l

#5:你的背包——6

自然数拆分,完全背包 1 #include <cstdio> 2 #define ll long long 3 #define mod 2147483648 4 #define rep(i, a, b) for (int i = a; i <= b; i++) 5 6 int n; 7 ll f[4005]; 8 9 int main() { 10 scanf("%d", &n); 11 f[0] = 1; 12 rep(i, 1, n) 13 rep(j,

01背包&amp;完全背包

·01背包&完全背包基础 01背包模型:给定n个物品,第i个物品体积为Wi,价值为Vi,背包容量为sum,选择一些物品放入背包,要求总价值最大. F[i,j]表示前i个物品放入容量为j的包里获得的最大价值. 对于任意一个物品都有两种状态,要么放要么不放,不放的话很显然价值同前,放的话就要从包里拿出一部分体积. 完全背包模型:给定n种物品,第i个物品体积为Wi,价值为Vi,背包容量为sum,选择一些物品放入背包,要求总价值最大. F[i,j]表示前i种物品放入容量为j的包里获得的最大价值. 01背

#2019122600027 递归五题

目录 1 全排列 2 01背包 3 自然数拆分 4 页码统计 5 汉诺塔 1 全排列 生成从\(1\)到\(n\)的全排列 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int a[25]; bool vis[25]; int n; int ans=0; void

【SQL】sql版Split函数。用于拆分字符串为单列表格

原文:[SQL]sql版Split函数.用于拆分字符串为单列表格 功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行.可选是否移除空格子串和重复项.市面上类似的函数不算少,但大多都是在循环中对原串进行改动,我感觉这样不好,虽然不知道sql的字符串是不是像.net的一样具有不可变性,但感觉尽量不要去动原串最好,万一sql的字串也不可变,那变一次就要产生一份,尤其是每圈循环都在变,内存消耗让人心疼,所以才有重新造个轮子的想

【递归】拆分自然数

[递归]拆分自然数 题目描述 “天下熙熙,皆为利来:天下攘攘,皆为利往”,监狱里的暗势力划分地盘的目的无非是为了获取利益,他们分配利益的方式是基于这样一个准则:设总利益为自然数N,则任何一个大于1的N,总可以拆分成若干个小于N的自然数之和,求出N的所有拆分后选择最合适的一种进行分配,例如当N=3时,有两种划分,即3=1+2和3=1+1+1.试求出N的所有拆分. 输入 一个整数即N,N<100. 输出 输出每一种划分方案,每种划分方案占一行,最后一行为方案总数. 样例输入 3 样例输出 3=1+1