洛谷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+10,mod=1000000007,M=50000; int n,q,p,v[N],w[N],poww[N]={1},divv[N],div_cnt,id1[M],id2[M],s[M],f[M]; il int read() { rc ch=gc;ri x=0;rb y=1; while(ch!='-' && (ch<'0' || ch>'9'))ch=gc; if(ch=='-')ch=gc,y=0; while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),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,1,n)v[i]=gcd(read(),p);rp(i,1,n)poww[i]=(poww[i-1]<<1)%mod; for(ri i=1;i*i<=p;++i)if(!(p%i)){divv[++div_cnt]=i;if(i*i!=p)divv[++div_cnt]=p/i;} sort(divv+1,divv+1+div_cnt);rp(i,1,div_cnt)if(divv[i]<=M)id1[divv[i]]=i;else id2[p/divv[i]]=i; rp(i,1,n)++s[ask_id(v[i])]; my(i,div_cnt,1) { ri tmp1=s[i],tmp2=0; rp(j,i+1,div_cnt)if(!(divv[j]%divv[i]))tmp2=(tmp2+f[j])%mod,tmp1+=s[j]; f[i]=(poww[tmp1]-1-tmp2+mod)%mod; } my(i,div_cnt,1) rp(j,1,i-1)if(!(divv[i]%divv[j]))f[i]=(f[i]+f[j])%mod; while(q--)printf("%d\n",f[ask_id(gcd(read(),p))]); return 0; }
最后放个代码趴!
洛谷P4495 奇怪的背包 [HAOI2018] 数论相关推荐
- 洛谷 P1135奇怪的电梯
洛谷 P1135奇怪的电梯 代码 import java.io.*; import java.math.BigInteger; import java.util.*;public class Main ...
- 洛谷P1852 奇怪的字符串
题目描述 输入两个01串,输出它们的最长公共子序列的长度 输入输出格式 输入格式: 一行,两个01串 输出格式: 最长公共子序列的长度 输入输出样例 输入样例#1: 复制 01010101010 00 ...
- P4495-[HAOI2018]奇怪的背包【数论,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P4495 题目大意 nnn个物品大小为viv_ivi,每个物品有无数个,背包的重量定义为大小和%P\%P%P. q ...
- 洛谷——3399 丝绸之路(背包)
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- 洛谷 1858 多人背包
https://www.luogu.org/problem/show?pid=1858 题目描述 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V. ...
- 洛谷P1169 树上分组背包
题解 第一次写树上分组背包的题目. 什么是分组背包? 分组背包就是将物品进行分组每组内部只能选择一类物品. for(int i = 1;i <= N;++i){for(int j = 0;j & ...
- 洛谷 P1852 奇怪的字符串
P1852 奇怪的字符串 题目描述 输入两个01串,输出它们的最长公共子序列的长度 输入输出格式 输入格式: 一行,两个01串 输出格式: 最长公共子序列的长度 输入输出样例 输入样例#1: 复制 0 ...
- 洛谷P2759 奇怪的函数
P2759 奇怪的函数 题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x ...
- 洛谷——P1680 奇怪的分组
P1680 奇怪的分组 题目背景 终于解出了dm同学的难题,dm同学同意帮v神联络.可dm同学有个习惯,就是联络同学的时候喜欢分组联络,而且分组的方式也很特别,要求第i组的的人数必须大于他指定的个数c ...
最新文章
- windows下sqlite3的基本操作
- 用 Fiddler 来弥补 Chrome Network 的小缺点
- PHP中exec()函数执行系统命令失败
- linux 帮助文档管理,Linux系统帮助文件使用——man命令
- 2个简单shell脚本(if,while,case语句)
- mysql连接量设置_mysql连接数设置操作方法(Too many connections)
- 日期格式转换,正则匹配后转换;指定时间增加天数加转格式;js时间转换格式
- 大智慧服务器修改,任意版本大智慧,帮您免费实现全推行情
- java驱动刷机_ProductTool(炬力芯片刷机工具+驱动) v5.46 中文安装免费版
- TMS320C6455之DDR2内存控制器
- 网页测试网速软件,网页测网速在线测试(speedtest软件测速原理)
- 3709: [PA2014]Bohater
- JSchException: Algorithm negotiation fail
- 完美tbody滚动效果
- 这3种管理者是“企业毒瘤”,须根除
- win7 搜索文件内容
- 基因家族分析及SCI写作技巧
- Lisseur Professionnel Ghd thé sont diurétiques et se traduira par nous
- php区分线上环境和测试环境
- 数据治理:元数据及元数据管理策略、方法和技术