[BZOJ5302][HAOI2018]奇怪的背包(DP)】的更多相关文章

由裴蜀定理得,一个集合S能得到w当且仅当gcd(S+{P})|w. 于是f[i][j]表示前i个物品gcd为j的方案数,发现gcd一定是P的因数,故总复杂度$O(n\sqrt{P}\log P)$(需要二分或者map). 又发现,将所有数a[i]全都变成gcd(a[i],P)对答案是没有影响的,于是物品数也变成了P的因子个数级别. 故总复杂度为P的因子个数的平方*log P. #include<cstdio> #include<algorithm> #define rep(i,l,…
BZOJ5302: [Haoi2018]奇怪的背包 https://lydsy.com/JudgeOnline/problem.php?id=5302 分析: 方程\(\sum\limits_{i=1}^nx_ia_i=y\)有整数解的条件是\(gcd|y\). 对于这道题,我们可以直接把\(P\)当成一个可以提供负值 or 可以抵消负值的存在. 那么这道题的条件就是\(gcd(d,P)|q_i\),其中\(d\)是选出那些数的\(gcd\). 问题缩小到了\(P\)的约数这个范围,最多\(14…
题目 小 CC 非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 PP ,当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对 PP 取模后的结果. 现在小 CC 有 nn 种体积不同的物品,第 ii 种占用体积为 V_iV i ​ ,每种物品都有无限个. 他会进行 qq 次询问,每次询问给出重量 w_iw i ​ ,你需要回答有多少种放入物品的方 案,能将一个初始为空的背包的重量变为 w_iw i ​ .注意,两种方案被认为是不同的, 当且仅当放入物品的种类不同,而与每种物品放…
由裴蜀定理,子集S有解当且仅当gcd(S,P)|w. 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案.注意到这里的gcd一定是P的约数,所以状态数是n√P的.然后可以通过这个得到gcd是j约数的选取方案.复杂度O(n√PlogP). 考虑优化.注意到每个数取gcd后的贡献仅与其和P的gcd有关,而这又一定是P的约数,所以本质不同的物品数量也是O(√P).那么上面的dp就可以优化到O(PlogP)了.当然这里的P是P的约数个数的平方,这显然是远远达不到P的. #include<io…
[BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\)的重量,而多个物品也只要\(gcd\)就好了. 现在的问题转变成了有多少个集合\(S\),满足\(S+\{P\}\)中所有数的\(gcd\)是\(w\)的因数.那么实际上就是直接令\(a[i]'=gcd(a[i],P)\),然后选出一个集合使得它是\(gcd(P,w)\)的因数. 考虑对于\(P\…
[HAOI2018]奇怪的背包 \(solution:\) 首先,这一道题目的描述很像完全背包,但它所说的背包总重量是在模P意义下的,所以肯定会用到数论.我们先分析一下,每一个物品可以放无数次,可以达到的背包重量其实就是所有\(gcd(a[i],P)\)的倍数. 这一点和天天爱跑步简直神似!因为天天爱跑步中每一个人也可以走无数步,跑到环形(就是模意义下). 但是这道题目还可以加入多种物品,我们不难发现,如果加入i和j两种物品,它所能达到的重量其实只是在gcd中多加了一个,就是所有\(gcd(a[…
P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P\)取模后的结果. 现在小\(C\)有\(n\)种体积不同的物品,第\(i\)种占用体积为\(V_i\),每种物品都有无限个. 他会进行\(q\)次询问,每次询问给出重量\(w_i\),你需要回答有多少种放入物品的方案,能将一个初始为空的背包的重量变为\(w_i\).注意,两种方案被认为是不同的,…
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5302 对于一个物品,设它体积为v,那么,在背包参数为p的情况下,它能达到gcd(v,p)的倍数的重量 对于两个物品,设它们的体积为v1和v2,那么,在背包参数为p的情况下,他能达到gcd(v1,v2,p)的倍数的重量 对于每个物品,我们记下它的gcd(v,p),问题变为给定一个x,求有多少个v的集合,是集合内所有元素的gcd能被x整除 我们设dp[i][j]表示p的前i个约数有多少种…
题目 暴力\(dp\)好有道理啊 于是我们来个反演吧 考虑一个体积序列\(\{v_1,v_2,...v_n\}\)能凑成\(w\)的条件 显然是 \[v_1x_1+v_2x_2+...+v_nx_n\equiv w(mod\ P)\] 根据贝祖定理,我们知道上面的同余方程有解的条件是 \[gcd(v_1,v_2...v_n,P)|w\] 现在题目转化成了求有多少个子集满足\(gcd(v_1,v_2..v_n,P)|w\)了 显然一个暴力\(dp\)记录一下当前\(gcd\)转移就好了,由于\(g…
Description Solution 首先 \(v_1,v_2,v_3...v_n,P\) 能够构成的最小数是 \(gcd(P,v_1,v_2,v_3...v_n)\) 然后 \(gcd(P,v_1,v_2,v_3...v_n)|w_i\) 则可以构成 \(w_i\) 所以我们直接背包一下就可以了,设 \(m\) 为 \(P\) 的约数个数,\(m\) 最多是 \(n^{\frac{1}{3}}\) 那么复杂度就是 \(O(n*m*logP)\) 容易发现如果 \(gcd(v_i,P)=gc…