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\ ...
随机推荐
- bzoj 1006: 神奇的国度 MCS
题目大意: 弦图的最小染色. 题解: 裸题. #include <vector> #include <cstdio> #include <cstring> #inc ...
- java静态方法(变量)、非静态方法(变量)区别
java静态方法.静态变量在调用时生成唯一标识,即在内存中给定一个静态位子,这样在调用时可以直接找到,而且会节省内存.但如果声明的静态方法.静态变量过多,会占用过多内存,有可能导致内存溢出. 非静态方 ...
- FPGA, Float 32bit, multiplyier by Verilog
1, FPGA device, using three 18bit x 18 bit multiplier to implement 32bit float multiplier 2, compari ...
- C#程序运行计时
var stp = new System.Diagnostics.Stopwatch(); stp.Start();//计时启动 ..........程序代码........... stp.Stop( ...
- 【转】 Pro Android学习笔记(七一):HTTP服务(5):多线程调用HttpClient
目录(?)[-] 应用共享HttpClient对象的同步问题 创建共享HttpClient代码 创建共享对象 创建可共享的HttpClient对象 使用共享HttpClient对象的代码 基础代码 修 ...
- 电脑当路由使用(目前只在win7上用过)
前提:电脑有无线网卡,并打开了无线 第一步使用管理员权限运行cmd.exe 1.执行如下命令 netsh wlan set hostednetwork mode=allow ssid=myWifi k ...
- java基础知识(8)---内部类
内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内 ...
- new LayoutParams 使用
ImageView imageView = new ImageView(mcontext); LayoutParams layoutParams = new LayoutParams(150,130) ...
- AngularJs(Part 11)--自定义Directive
先对自定义Directive有一个大体的映像 myModule.directive('myDirective',function(injectables){ var directiveDefiniti ...
- R语言系列:数据的基本运算
基本运算符号 1.基本数学计算 +.-.*./.^.%%(求模).%/%(整除) 注意:求模运算两边若为小数,则整数和小数部分分别求模.例:5.6%%2.2 2.比较运算 >.< ...