haoi2018奇怪的背包题解
题目传送门: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个约数有多少种组合是组合后的gcd为j。
接下来,我们考虑怎么转移
先给伪代码(不加取模):
for(i=1;i<=约数个数;++i)
for(j=1;j<=约数个数;++j){
x=gcd(第i个约数,第j个约数)dp[i][x]+=dp[i-1][j]*(2^约数i的个数-1);
dp[i][j]+=dp[i][j-1];
}
这种转移方式有点奇怪,是个好思路,我们平常的dp都是枚举状态,然后在寻找能转移到我们枚举的状态的状态。这个dp是先枚举已经计算完成的状态,在计算这些状态能转移到哪,更新,有点类似noip2017 提高组day1T3的拓扑排序dp写法。
上AC代码(wxy数组就是dp数组,有些细节上的处理我还没讲,可以自己实现,ps:我常数有点大(两个map)):
#include <bits/stdc++.h>
using namespace std;
;
;
#define _l long long
int n,q,p,ys[N];
map<int,int>reff;
map<int,int>cnt;
_l p2[N*N],wxy[N][N],an[N];
? y:gcd(y,x%y);}
int main(){
scanf("%d%d%d",&n,&q,&p);
int i;
;i*i<=p;++i)){
ys[++ys[]]=i,reff[i]=ys[];]]=p/i,reff[p/i]=ys[];
}
;i<=n;++i){
int x;scanf("%d",&x);x=gcd(max(x,p),min(x,p));
++cnt[x];
}
]=;
;i<=n;++i)p2[i]=(p2[i-]*)%md;wxy[][reff[p]]=;
;i<=ys[];++i);j<=ys[];++j){
int tmp=gcd(max(ys[i],ys[j]),min(ys[i],ys[j]));
wxy[i][reff[tmp]]=(wxy[i][reff[tmp]]+wxy[i-][j]*(_l)(p2[cnt[ys[i]]]-))%md;
wxy[i][j]=(wxy[i-][j]+wxy[i][j])%md;
}
;i<=ys[];++i);j<=ys[];++j))an[i]=(an[i]+wxy[ys[]][j])%md;
while(q--){
int x;scanf("%d",&x);x=gcd(max(x,p),min(x,p));
printf("%lld\n",an[reff[x]]);
}
}
haoi2018奇怪的背包题解的更多相关文章
- 【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)
[BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\ ...
- [HAOI2018]奇怪的背包 (DP,数论)
[HAOI2018]奇怪的背包 \(solution:\) 首先,这一道题目的描述很像完全背包,但它所说的背包总重量是在模P意义下的,所以肯定会用到数论.我们先分析一下,每一个物品可以放无数次,可以达 ...
- 洛谷 P4495 [HAOI2018]奇怪的背包 解题报告
P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P ...
- BZOJ5302: [Haoi2018]奇怪的背包
BZOJ5302: [Haoi2018]奇怪的背包 https://lydsy.com/JudgeOnline/problem.php?id=5302 分析: 方程\(\sum\limits_{i=1 ...
- BZOJ5302 [HAOI2018]奇怪的背包 【数论 + dp】
题目 小 CC 非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 PP ,当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对 PP 取模后的结果. 现在小 CC 有 nn 种体积不同 ...
- 洛谷P4495 [HAOI2018]奇怪的背包(数论)
题面 传送门 题解 好神仙的思路啊--orzyyb 因为不限次数,所以一个体积为\(V_i\)的物品可以表示出所有重量为\(\gcd(V_i,P)\)的倍数的物品,而所有物品的总和就是这些所有的\(\ ...
- bzoj 5302: [Haoi2018]奇怪的背包
Description Solution 首先 \(v_1,v_2,v_3...v_n,P\) 能够构成的最小数是 \(gcd(P,v_1,v_2,v_3...v_n)\) 然后 \(gcd(P,v_ ...
- Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】
题目分析: 首先打个暴力求一下$10^9$以内因子最多的数的因子个数,发现只有$1344$个. 由于有$ax+by=k*(a,b)$和2017年noip的结论,所以我们可以发现对于任意多个数$a_1, ...
- [HAOI2018]奇怪的背包
题目 暴力\(dp\)好有道理啊 于是我们来个反演吧 考虑一个体积序列\(\{v_1,v_2,...v_n\}\)能凑成\(w\)的条件 显然是 \[v_1x_1+v_2x_2+...+v_nx_n\ ...
随机推荐
- bzoj4010
知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴之间口味搭 ...
- 每天一个linux命令(7):rmdir命令
版权声明更新:2017-05-11博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的rmdir命令. ...
- 深入V8引擎-枚举+位运算实现参数配置
不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持.为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白. 基本上从初始化引擎,到Isolate.handleScope ...
- BZOJ1206:[HNOI2005]虚拟内存
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- POJ1088(记忆化搜索)
经典记忆化搜索题目.当 从每个点一次进行搜索时要采用 记忆化搜索 #include"cstdio" #include"algorithm" using name ...
- css动画和渐变
变形: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元素的变形:transform transform:none | <tra ...
- wpf 可视化树的注意点
将控件的visibility 设置为collapse时,控件的可视化树并未生成,此时并不能查找到控件内的子控件. 若某控件想对用户不可见,且可以生成可视化树,则需将控件的visibility 设置为h ...
- Java中是构造器创建对象吗?
首先,这里说明” Java中是构造器创建对象 “这句话是完全错误的. Java中构造器的作用主要是为了初始化变量的值...其实在执行构造器之前,Java对象所需要的内存空间,已经产生了... 一般可以 ...
- WPF bmp和二进制转换
bmp转二进制: FileStream fs = File.OpenRead(filepath); //filepath文件路径 Byte[] tempBuff = new Byte[fs.Lengt ...
- Servlet编程实例
---------------siwuxie095 登录实例: 从 login.jsp 提交登录信息到 LoginServlet,在 LoginServlet 中打印登录信息 工程结构目录如下: Lo ...