题目

有一个大小为\(n\)的背包,有\(n\)种物品,

第\(i\)种物品的大小为\(i\),且有\(i\)个,

求装满这个背包的方案数

\(n\leq 10^5\)


分析

直接多重背包会有问题,考虑根号分治,

对于大小\(\leq \sqrt n\)的物品,

其实可以用前缀和优化多重背包,因为大小为\(i\)

对于大小\(> \sqrt n\)的物品,设\(g[i][j]\)表示选了\(i\)种物品容量为\(j\)的方案数,

考虑整体物品加1或者给背包新加入大小为\(\sqrt n+1\)的物品,即

\(g[i][j]=g[i][j-i]+g[i-1][j-\sqrt n-1]\)

合并两个背包即可


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#define rr register
using namespace std;
const int N=100011,mod=23333333;
int f[2][N],g[2][N],s[N],n,bl,ans;
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
scanf("%d",&n),bl=sqrt(n),f[0][0]=1;
for (rr int i=1;i<=bl;++i){
for (rr int j=0;j<i;++j) s[j]=0;
for (rr int j=0;j<=n;++j){
f[i&1][j]=mo(f[(i&1)^1][j],s[j%i]);
s[j%i]=mo(s[j%i],f[(i&1)^1][j]);
if (j>=i*i) s[j%i]=mo(s[j%i],mod-f[(i&1)^1][j-i*i]);
}
}
g[0][0]=1,ans=f[bl&1][n];
for (rr int i=1;i<=bl;++i){
for (rr int j=0;j<i;++j) g[i&1][j]=0;
for (rr int j=i;j<=n;++j){
g[i&1][j]=g[i&1][j-i];
if (j>bl) g[i&1][j]=mo(g[i&1][j],g[(i&1)^1][j-bl-1]);
}
for (rr int j=i;j<=n;++j) ans=mo(ans,1ll*f[bl&1][n-j]*g[i&1][j]%mod);
}
return !printf("%d",ans);
}

#根号分治,背包#51nod 1597 有限背包计数问题 LOJ 6089 小Y的背包计数问题的更多相关文章

  1. LOJ #6089. 小 Y 的背包计数问题

    LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...

  2. LOJ#6089 小 Y 的背包计数问题 - DP精题

    题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/ ...

  3. loj 6089 小 Y 的背包计数问题——分类进行的背包

    题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...

  4. LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP

    题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...

  5. 【LOJ6089】小Y的背包计数问题(动态规划)

    [LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...

  6. 题解 51nod 1597 有限背包计数问题

    题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \( ...

  7. LOJ6089 小Y的背包计数问题(根号优化背包)

    Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...

  8. [loj6089]小Y的背包计数问题

    https://www.zybuluo.com/ysner/note/1285358 题面 小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品. 对于第\(i\)种物品,共有 ...

  9. 51nod 1597 有限背包计数问题 (背包 分块)

    题意 题目链接 Sol 不会做啊AAA.. 暴力上肯定是不行的,考虑根号分组 设\(m = \sqrt{n}\) 对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下 ...

  10. LOJ6089 小Y的背包计数问题 背包、根号分治

    题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333 ...

随机推荐

  1. 彻底搞懂Java中的Runnable和Thread

    写在前面 今天在阅读ThreadPoolExecutor源码的时候觉得有些地方理解起来似是而非,很别扭!最后才猛然发现,原来是我自己的问题:没有真正理解Runnable和Thread的含义! 我之前对 ...

  2. 2019年在浏览器用原生js写WebGL,绘制图形;

    因为JavaScript高级程序设计(第三版)中的运行书上15.3WebGL部分的代码时在chrome和firefox浏览器下报错,在后面我网上初步找了一圈,好像没人做出真正可以用的代码;所以我就自己 ...

  3. 【小记事】如何设置vscode代码格式化时不要自动换行

    最近一格式化就给我分好多行,好气哦(`ヘ´)=3 在setting.json中添加如下代码: "vetur.format.defaultFormatter.html": " ...

  4. 统信UOS系统开发笔记(五):安装QtCreator开发IDE中的中文输入环境Fcitx输入法

    前言   中文输入法,QtCreator中无法输入中文也是ubuntu中一个常规问题,在国产银河麒麟系统中也有此问题(PS:最终无法结局,用文本自行贴),国产UOS也有此问题,本片要解决此问题,主要是 ...

  5. Java实现DES加密解密

    DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥 加密原理: DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产 ...

  6. 【Azure Redis 缓存】Redis Geo-replication(异地复制)的问题 

    问题描述 在Azure官网中,已列出了一系列的常规问题:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-geo-repli ...

  7. CentOS 设置系统时间与网络时间同步

    CentOS 设置系统时间与网络时间同步 一.Linux的时间分为(两种) System Clock(系统时间) 指当前Linux Kernel中的时间 Real Time Clock (硬件时间,简 ...

  8. redis迁移同步工具-redis-shake

    官方文档: https://github.com/alibaba/RedisShake/wiki/快速开始:数据迁移 下载: https://github.com/alibaba/RedisShake ...

  9. CodeIgniter3.chm 打包编译 需要 hhc.exe - php框架

    电子书地址 https://github.com/CodeIgniter-Chinese/rapid-php-application-development 我打包编译好了chm,https://fi ...

  10. 记Okhttp的拦截器导致app崩溃问题

    原文: 记Okhttp的拦截器导致app崩溃问题 - Stars-One的杂货小窝 app对接的后台接口,传参需要加密,获取数据需要解密,于是使用了拦截器去实现,然后发现以下问题: 即使在发起请求的那 ...