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


神仙题啊orz。

首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分。

\(>\sqrt n\)的部分因为最多选\(\sqrt n\)个数,所以数量就没有卵用了。然后就用完全背包的一个常见套路(?)可以对一个空的序列整体+1或者在最左边加上一个\(\sqrt n+1\),这个操作序列和完全背包的选择方案一一对应。感性理解一下是对的emmmm,复杂度\(O(n\sqrt n)\)

\(<=\sqrt n\)的部分只有\(\sqrt n\)个数,就可以多重背包做,然后用剩余系优化。

剩余系就是说多重背包方案的转移方程是\(f[i][j]=\sum_{k=1}^{i}f[i-1][j-ki]\)这个样子的

可以发现转移过来的j都和原来的j同余\((\text{mod } i)\)

对于每一个\(\text{mod }i\)的余数做一个f的前缀和,转移过来的一定是连续的一段

orz

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
#define mod 23333333
ll f[320][100010];
ll h[100010],s[100010];
int main(){
int n=gi(),m=int(sqrt(n));
f[0][0]=1;s[0]=1;
for(int i=1;i<=m;++i)
for(int j=0;j<=n;++j){
if(j>i)f[i][j]+=f[i][j-i];
if(j>m)f[i][j]+=f[i-1][j-m-1];
f[i][j]%=mod;
s[j]=(s[j]+f[i][j])%mod;
}
memset(f,0,sizeof f);f[0][0]=1;
for(int i=1;i<=m;++i){
for(int j=0;j<i;++j){
int t=0;
for(int k=j;k<=n;k+=i)h[++t]=f[i-1][k];
for(int k=2;k<=t;++k)h[k]=(h[k]+h[k-1])%mod;
for(int k=j,tot=0;k<=n;k+=i){
++tot;
f[i][k]=(f[i][k]+h[tot]-h[std::max(0,tot-i-1)]+mod)%mod;
}
}
}
ll ans=0;
for(int i=0;i<=n;++i)ans+=s[i]*f[m][n-i]%mod;
printf("%lld\n",ans%mod);
return 0;
}

LOJ #6089. 小 Y 的背包计数问题的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. loj6089 小 Y 的背包计数问题

    link 吐槽: 好吧开学了果然忙得要死……不过为了证明我的blog还没有凉,还是跑来更一波水题 题意: 有n种物品,第i种体积为i,问装满一个大小为n的背包有多少种方案? $n\leq 10^5.$ ...

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

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

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

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

  9. LOJ6089 小Y的背包计数问题 背包

    正解:背包 解题报告: 先放传送门! 好烦昂感觉真的欠下一堆,,,高级数据结构知识点什么的都不会,基础又麻油打扎实NOIp前的题单什么的都还麻油刷完,,,就很难过,,,哭辣QAQ 不说辣看这题QwQ! ...

随机推荐

  1. Python学习---JSON补充内容[中文编码 + dumps解析]

    JSON补充内容[微信解决中文乱码,接上] import json # 英文显示 dic = {"hello": "world"} str = json.dum ...

  2. javascript改写 <select>checked的选中,并不会出发change事件,太好了!

    <html> <title>测试select标签的分别用程序checked.用户手动checked</title> <body> 第一级菜单: < ...

  3. return 返回值的问题

    def yue(): print("1. 打开手机") print("2. 打开陌陌") print("3. 找个漂亮的小姐姐") prin ...

  4. 2018.08.30 21:12 第一个Django程序完成

    from django.http import HttpResponse def hello(request): return HttpResponse("Hello world ! &qu ...

  5. JS日期比较大小 给定时间和持续时间计算最终时间

       /* 往指定时间字符串上加时间间隔,获得新的时间字符串  * startDateStr:开始时间字符串,类似"2015-7-20 17:26:00"  * durationN ...

  6. Spring-IOC bean 创建过程中的 ObjectFactory

    AbstractBeanFactory中doGetBean方法里有一段拿到RootBeanDefinition后,实例化该bean的方法 // Create bean instance. if (mb ...

  7. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

  8. Day9 JSP

    JSP概述 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP实际上就是Servlet. jsp = html + ...

  9. 20145203盖泽双 《Java程序设计》第6周学习总结

    20145203盖泽双 <Java程序设计>第6周学习总结 教材学习内容总结 1.如果要将数据从来源中取出,可以使用输入串流,若将数据写入目地, 可以使用输出串流.在java中,输入串流代 ...

  10. Sublime Text常用设置之个人配置

    一.安装 1.安装包下载:  http://www.sublimetext.com/3 (傻瓜式安装) 2.Package Control安装: 1)Ctrl+~或者View——Show Consol ...