洛谷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)接下来每行两个数,表示体积和价值输出格 ...
随机推荐
- 怎么关闭win10和win8快速启动
电源选项-- 选择电源按钮的功能--- 更改当前不可用的设置-- 快速启动勾去掉
- android开发(46) 使用 textview实现文字的阴影效果,浮雕效果
前言 最近看到一些文字的阴影效果很有意思,尝试了下,形成本文.“平面效果“是我们平时常见的平面的样子.“阴影效果”会给人一种凸起的感觉.浮雕效果会给一种雕刻“凹陷”的感觉. 演示效果图 方法 使用 t ...
- 小技巧 - CSS中:hover调试
在调试CSS的时候,我一般使用Chrome的F12开发者工具,或者FireFox的FireBug直接在元素上面修改好Style后,再写入到CSS中.前几天遇到一个问题就是a:hover,鼠标一移开效果 ...
- 用OpenGL实现动态的立体时钟
(在学期末做的图形学课程设计,特将学习心得整理如下) 一.设计思路 1,设计一个平面的时钟: 按照 钟面——>中心点——>刻度——>时针——>分针——>秒针 的顺序绘制. ...
- Go-MySQL-Driver
1.下载Go-Mysql-Driver go get github.com/go-sql-driver/mysql 2.引入import import( "database/sql" ...
- mysql的text字段长度?mysql数据库中text字段长度不够的问题
类型是可变长度的字符串,最多65535个字符: 可以把字段类型改成MEDIUMTEXT(最多存放16777215个字符)或者LONGTEXT(最多存放4294967295个字符). MySQL ...
- 04单例模式Singleton
一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式, 可以保证为一个类只生成唯一的实例对象.也就是说, 在整个程序空间中,该类只存在一个实例对象. 其实,GoF对单例模式的定义是:保证一个 ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 + Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供 ...
- 【转载】技巧:Vim 的纵向编辑模式
如果要我选一个Vim中让我觉得Life Changing功能的话,我一定会选Vim的块编辑功能,也就是Ctrl+V,虽然还有些别的编辑器也有这功能,但目前为止,我从中受益颇大 原文地址:技巧:Vim ...
- fs项目---->async/await的学习(一)
2018-07-11号,我来到了fs项目组担任后端开发的角色.这是我来thoughtworks以来首个的正式项目,不管是在技术还是在敏捷的实践中都是受益匪浅.来感受tw特殊的文化的同时,我希望自己能够 ...