#根号分治,背包#51nod 1597 有限背包计数问题 LOJ 6089 小Y的背包计数问题
题目
有一个大小为\(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的背包计数问题的更多相关文章
- LOJ #6089. 小 Y 的背包计数问题
LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...
- LOJ#6089 小 Y 的背包计数问题 - DP精题
题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/ ...
- loj 6089 小 Y 的背包计数问题——分类进行的背包
题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...
- LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...
- 【LOJ6089】小Y的背包计数问题(动态规划)
[LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...
- 题解 51nod 1597 有限背包计数问题
题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \( ...
- LOJ6089 小Y的背包计数问题(根号优化背包)
Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...
- [loj6089]小Y的背包计数问题
https://www.zybuluo.com/ysner/note/1285358 题面 小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品. 对于第\(i\)种物品,共有 ...
- 51nod 1597 有限背包计数问题 (背包 分块)
题意 题目链接 Sol 不会做啊AAA.. 暴力上肯定是不行的,考虑根号分组 设\(m = \sqrt{n}\) 对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下 ...
- LOJ6089 小Y的背包计数问题 背包、根号分治
题目传送门 题意:给出$N$表示背包容量,且会给出$N$种物品,第$i$个物品大小为$i$,数量也为$i$,求装满这个背包的方案数,对$23333333$取模.$N \leq 10^5$ $23333 ...
随机推荐
- r0tracer 源码分析
使用方法 修改r0tracer.js文件最底部处的代码,开启某一个Hook模式. function main() { Java.perform(function () { console.Purple ...
- dataclass装饰器
简介 根据定义dataclass时指"一个带有默认值的可变的namedtuple" 简单来说,就是你定义一个很普通的类,@dataclass装饰器可以 帮你生成__repr__._ ...
- SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448
SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448 根据MES模赛思对其全球客户的问卷调查表明, 尽管有相当一部分的参与者(35%)认为SOTIF在功能安全 ...
- 【Azure Developer】使用 Azure PowerShell 执行 Azure 表存储操作时遇见的4个问题
要使用PowerShell操作Azure的表存储,需要经过以下步骤: 1:必须安装 Az 和 AzTable 模块.安装命令为: #安装 Az 模块 Install-Module -Name Az - ...
- C++ 多线程笔记2 线程同步
C++ 多线程笔记2 线程同步 并发(Concurrency)和并行(Parallelism) 并发是指在单核CPU上,通过时间片轮转的方式,让多个任务看起来像是同时进行的.实际上,CPU在一个时间段 ...
- ConfigMap挂载与Subpath在Nginx容器中的应用
本文分享自华为云社区<nginx.conf以configmap文件形式挂载到nginx容器中以及subpath使用场景>,作者:可以交个朋友. 背景 nginx.conf通过configm ...
- C# DiagnosticSource and DiagnosticListener
class Program { private static readonly DiagnosticSource testDiagnosticListener = new DiagnosticList ...
- [VueJsDev] 日志 - nginxConfig 配置文件备份
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html nginxConfig 配置文件备份 ::: details ...
- Android 发布aar远程依赖出现扩展方法无法找到问题
原文: Android 发布aar远程依赖出现扩展方法无法找到问题-Stars-One的杂货小窝 起因 最近在整合自己的工具类库,偶然发现之前写的扩展方法使用远程依赖却是提示找不到 但我有个aar库却 ...
- java之Timer类使用方法小例子
直接上代码: package com.iamzken.test; import java.util.Timer; import java.util.TimerTask; public class Te ...