题目

有一个大小为\(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. r0tracer 源码分析

    使用方法 修改r0tracer.js文件最底部处的代码,开启某一个Hook模式. function main() { Java.perform(function () { console.Purple ...

  2. dataclass装饰器

    简介 根据定义dataclass时指"一个带有默认值的可变的namedtuple" 简单来说,就是你定义一个很普通的类,@dataclass装饰器可以 帮你生成__repr__._ ...

  3. SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448

    SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448 根据MES模赛思对其全球客户的问卷调查表明, 尽管有相当一部分的参与者(35%)认为SOTIF在功能安全 ...

  4. 【Azure Developer】使用 Azure PowerShell 执行 Azure 表存储操作时遇见的4个问题

    要使用PowerShell操作Azure的表存储,需要经过以下步骤: 1:必须安装 Az 和 AzTable 模块.安装命令为: #安装 Az 模块 Install-Module -Name Az - ...

  5. C++ 多线程笔记2 线程同步

    C++ 多线程笔记2 线程同步 并发(Concurrency)和并行(Parallelism) 并发是指在单核CPU上,通过时间片轮转的方式,让多个任务看起来像是同时进行的.实际上,CPU在一个时间段 ...

  6. ConfigMap挂载与Subpath在Nginx容器中的应用

    本文分享自华为云社区<nginx.conf以configmap文件形式挂载到nginx容器中以及subpath使用场景>,作者:可以交个朋友. 背景 nginx.conf通过configm ...

  7. C# DiagnosticSource and DiagnosticListener

    class Program { private static readonly DiagnosticSource testDiagnosticListener = new DiagnosticList ...

  8. [VueJsDev] 日志 - nginxConfig 配置文件备份

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html nginxConfig 配置文件备份 ::: details ...

  9. Android 发布aar远程依赖出现扩展方法无法找到问题

    原文: Android 发布aar远程依赖出现扩展方法无法找到问题-Stars-One的杂货小窝 起因 最近在整合自己的工具类库,偶然发现之前写的扩展方法使用远程依赖却是提示找不到 但我有个aar库却 ...

  10. java之Timer类使用方法小例子

    直接上代码: package com.iamzken.test; import java.util.Timer; import java.util.TimerTask; public class Te ...