洛谷P4495 奇怪的背包 [HAOI2018] 数论
正解:数论+dp
解题报告:
首先看到这题,跳无数次,自然而然可以想到之前考过好几次了的一个结论——如果只考虑无限放置i,它可以且仅可以跳到gcd(p,v[i])
举一反三一下,如果有多个i,表示成a[i]好了,那就一定是能跳到gcd(p,v[a[1]],v[a[2]],..,v[a[n]]),因为这个太长了后面单一个gcd就指的它
挺显然的这儿不证明了QAQ
然后这儿就相当于是问有多少种a[i]的方案能满足gcd|gcd(p,w)
然后因为多组询问,显然考虑能不能预处理一个f[i]:能表示出i的集合的个数
显然可以考虑先求f[i]:gcd恰好为i的集合个数,然后搞个f[i]=∑f[d](d|i),就求出来答案辣
然后现在就变成考虑怎么样求出前面那个意义下的f
考虑什么情况可能对f[i]有贡献?显然只有i的倍数才行
所以先统计出i的倍数的个数为cnt,那就有gcd为i的倍数的数就有2cnt-1个,这里应该能get?
但是要考虑去重昂,就因为我们统计的是gcd为i的倍数的个数,所以把所有是i的倍数的再减去就得到的是gcd=i的数量了
最后把那个f[i]=∑f[d](d|i)搞下就欧克
综上,这题就做完了
好像说得很潦草不好理解的样子,但反正没人看,我又懒得写了,就这样趴hhhh
如果居然有人看又没看懂在下面留言就成我再重新组织下语言重构这篇题解算了,,,
然后再瞎说下细节趴QAQ
首先因为p的范围是1e9,然后对p的所有约数都是要统计的,所以如果设数组就要开到1e9,所以显然考虑离散化一下,但是怎么离散化还是要记下name[i]=j表示i的离散化之后对应的值,就还是要开1e9的
所以有两种方案,一个是开个map,另一个是开两个name数组
因为我是开了两个nam数组而且map那个很无脑所以map那个我就不说了只大概港下name数组
就直接分类讨论,随便设定一个界限M,M的大小随意只要是能开得下数组又没太小就欧克
然后对d<=M的因数d直接放到name1[d]里存着,否则存到name2[p/d]
然后就做完了?应该没什么了,其实我觉得我讲得还是挺详细的来着,,,
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define mp make_pair
#define ri register int
#define rb register bool
#define rc register char
#define lb(x) lower_bound(st+1,st+st_cnt,x)-st
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=1e6+,mod=,M=;
int n,q,p,v[N],w[N],poww[N]={},divv[N],div_cnt,id1[M],id2[M],s[M],f[M]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int gcd(ri gd,ri gs){return gs?gcd(gs,gd%gs):gd;}
il int ask_id(ri x){return x<=M?id1[x]:id2[p/x];} int main()
{
// freopen("4495.in","r",stdin);//freopen("4495.out","w",stdout);
n=read();q=read();p=read();rp(i,,n)v[i]=gcd(read(),p);rp(i,,n)poww[i]=(poww[i-]<<)%mod;
for(ri i=;i*i<=p;++i)if(!(p%i)){divv[++div_cnt]=i;if(i*i!=p)divv[++div_cnt]=p/i;}
sort(divv+,divv++div_cnt);rp(i,,div_cnt)if(divv[i]<=M)id1[divv[i]]=i;else id2[p/divv[i]]=i;
rp(i,,n)++s[ask_id(v[i])];
my(i,div_cnt,)
{
ri tmp1=s[i],tmp2=;
rp(j,i+,div_cnt)if(!(divv[j]%divv[i]))tmp2=(tmp2+f[j])%mod,tmp1+=s[j];
f[i]=(poww[tmp1]--tmp2+mod)%mod;
}
my(i,div_cnt,)
rp(j,,i-)if(!(divv[i]%divv[j]))f[i]=(f[i]+f[j])%mod;
while(q--)printf("%d\n",f[ask_id(gcd(read(),p))]);
return ;
}
最后放个代码趴!
洛谷P4495 奇怪的背包 [HAOI2018] 数论的更多相关文章
- 洛谷 P1858 多人背包 DP
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...
- 洛谷 P4495 [HAOI2018]奇怪的背包 解题报告
P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P ...
- BZOJ5302 [HAOI2018]奇怪的背包 【数论 + dp】
题目 小 CC 非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 PP ,当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对 PP 取模后的结果. 现在小 CC 有 nn 种体积不同 ...
- [洛谷P1858] 多人背包
洛谷题目链接:多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数K.V.N 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 输入输出样例 输入样例# ...
- 【DFS与BFS】洛谷 P1135 奇怪的电梯
题目:奇怪的电梯 - 洛谷 (luogu.com.cn) 因为此题数据范围较小,有dfs及bfs等多种做法. DFS 比较正常的dfs,注意vis数组一定要回溯,不然会漏情况 例如这个数据 11 1 ...
- 洛谷P1852 奇怪的字符串
题目描述 输入两个01串,输出它们的最长公共子序列的长度 输入输出格式 输入格式: 一行,两个01串 输出格式: 最长公共子序列的长度 输入输出样例 输入样例#1: 复制 01010101010 00 ...
- 洛谷P4495 [HAOI2018]奇怪的背包(数论)
题面 传送门 题解 好神仙的思路啊--orzyyb 因为不限次数,所以一个体积为\(V_i\)的物品可以表示出所有重量为\(\gcd(V_i,P)\)的倍数的物品,而所有物品的总和就是这些所有的\(\ ...
- TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs
题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开 ...
- 洛谷 P1858 多人背包
求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...
随机推荐
- Tomcat配置多个域名绑定到不同项目
<Host name="www.dn-serve.com" appBase="webapps" unpackWARs="true" a ...
- ubuntu下使用golang、qml与ubuntu sdk开发桌面应用 (简单示例)
找了很长时间go的gui库,试了gtk,准备试qt的时候发现了这个qml库,试了下很好用. ##准备工作 **1.Go 1.2RC1** go的版本应该不能低于这个,我是在1.2RC发布当天升级后发现 ...
- WebMisSharp,WebMisCentral,企业框架正则表达式规则共享专版
ElegantWM.WebUI/Application/common/src/Tools.js 欢迎大家贡献更多的正则验证规则,目前支持如下: /*************************** ...
- QTableView 二次整理
一.设置可视化的组件 参考: http://www.cnblogs.com/ribavnu/p/4810412.html 二.常用基本属性 http://www.cnblogs.com/ribavnu ...
- [Algorithm] *String Matching and Hashing
Link: Computer Algorithms: Rabin-Karp String Searching 为了避免挨个字符对文本和模式串进行比较,我们可以尝试一次性判断两者是否相等. 因此,我们需 ...
- 【租房合同】2017北京市房屋租赁合同(自行成交版).doc
最近在北京租房,找租房合同 这个文档还是比较新的,在百度文库上需要积分下载的文档,现在共享给大家吧. 下载地址: https://pan.baidu.com/s/1cEh7lhBqQgkJhB32Df ...
- 微信小游戏的本地缓存和清除的使用 (text.js image.js file-util.js)
参考: 微信小游戏,文件系统 UpdateManager-小游戏 一.Egret提供的本地缓存工具类( 备注:新版本进行了修改,并增加了sound.js等) 在微信小游戏项目中,Egret提供了fil ...
- python web自动化测试中失败截图方法汇总
在使用web自动化测试中,用例失败则自动截图的网上也有,但实际能落地的却没看到,现总结在在实际应用中失败截图的几种方法: 一.使用unittest框架截图方法: 1.在tearDown中写入截图的 ...
- TIScript 代码Demo
var filelist = null; function alert(msg) { view.msgbox(null,msg); } self.on("click", " ...
- 录制用户的音频,视屏 navigator.mediaDevices.getUserMedia
google 文档 HACKS 文档 相关代码 获取本地的音频 <input type="file" accept="audio/*" capture=& ...