洛谷 P4454 [CQOI2018]破解D-H协议
题目
https://www.luogu.com.cn/problem/P4454
杂题乱做ing...
思路
首先我们把式子列一下:
\(g^a\equiv A(mod P)\)
\(g^b\equiv B(mod P)\)
求\(g^{ab}\)
g是原根,那是不是要用到一些高妙的数论性质呀。。。然后我们看一眼式子,发现只要把\(a\)和\(b\)求出来就行了,也就是求\(A\)和\(B\)在模\(P\)意义下的离散对数。
这不就是个BSGS裸题嘛,为什么能评成紫题啊。。。
代码(伪)
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
map<int,int> H;
ll kasumi(ll x,ll p,ll m){
ll ans=1,base=x;
for(;p;p>>=1){
if(p&1) ans=ans*base%m;
base=base*base%m;
}
return ans;
}
ll BSGS(ll a,ll b,ll p){
int i;
H.clear();
ll k=(ll)(sqrt(p)+1);
ll ak=1;
H[b]=0;
for(i=1;i<k;++i){
ak=ak*a%p;
H[(int)(ak*b%p)]=i;
}
ak=ak*a%p;
ll t=1;
for(i=1;i<=k;++i){
t=t*ak%p;
if(H.count((int)t)){
int z=H.find((int)t)->second;
return i*k-z;
}
}
}
int main(){
int T;
ll g,P;
ll a,b,A,B;
ll ans;
scanf("%lld%lld",&g,&P);
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&A,&B);
a=BSGS(g,A,P);
b=BSGS(g,B,P);
ans=kasumi(g,a*b%(P-1),P);
printf("%lld\n",ans);
}
// system("pause");
return 0;
}
喜闻乐见卡map,然后我们自己写个哈希表,这题就水完了。
代码(真)
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#define ll long long
#define zzd 233333
using namespace std;
struct Hashmap{
int fst[zzd],nxt[1<<16],cnt;
struct data{
int x,y;
} d[1<<16];
void clear(){
cnt=0;
memset(fst,0,sizeof(fst));
memset(nxt,0,sizeof(nxt));
}
int insert(int t1,int t2){
d[++cnt].x=t1;
d[cnt].y=t2;
nxt[cnt]=fst[t1%zzd];
fst[t1%zzd]=cnt;
}
int find(int t){
int i=fst[t%zzd];
while(i&&d[i].x!=t) i=nxt[i];
if(i) return d[i].y;
else return -1;
}
} H;
ll kasumi(ll x,ll p,ll m){
ll ans=1,base=x;
for(;p;p>>=1){
if(p&1) ans=ans*base%m;
base=base*base%m;
}
return ans;
}
ll BSGS(ll a,ll b,ll p){
int i;
H.clear();
ll k=(ll)(sqrt(p)+1);
ll ak=1;
H.insert(b,0);
for(i=1;i<k;++i){
ak=ak*a%p;
H.insert((int)(ak*b%p),i);
}
ak=ak*a%p;
ll t=1;
for(i=1;i<=k;++i){
t=t*ak%p;
int z=H.find((int)t);
if(z>=0) return i*k-z;
}
}
int main(){
int T;
ll g,P;
ll a,b,A,B;
ll ans;
scanf("%lld%lld",&g,&P);
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&A,&B);
a=BSGS(g,A,P);
b=BSGS(g,B,P);
ans=kasumi(g,a*b%(P-1),P);
printf("%lld\n",ans);
}
// system("pause");
return 0;
}
洛谷 P4454 [CQOI2018]破解D-H协议的更多相关文章
- P4454 [CQOI2018]破解D-H协议
链接 这题并不难只是需要把题读懂 - By ShadderLeave 一句话题意 给定两个数 \(p\)和\(g\),有\(t\)组询问,每组询问给出\(A\)和\(B\) 其中 A = \(g^a ...
- 洛谷P4462 [CQOI2018]异或序列(莫队)
题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...
- 洛谷P4358密钥破解 [CQOI2016] 数论
正解:数论 解题报告: 先,放个传送门QwQ 这题难点可能在理解题意,,, 所以我先放个题意QAQ 大概就是说,给定一个整数N,可以被拆成两个质数的成绩p*q,然后给出了一个数e,求d满足e*d=1( ...
- 洛谷P4462 [CQOI2018]异或序列(莫队)
打广告->[这里](https://www.cnblogs.com/bztMinamoto/p/9538115.html) 我蠢了…… 如果$a_{l} xor ...a_{r}=k$,那么只要 ...
- 洛谷4455 [CQOI2018]社交网络 (有向图矩阵树定理)(学习笔记)
sro_ptx_orz qwq算是一个套路的记录 对于一个有向图来说 如果你要求一个外向生成树的话,那么如果存在一个\(u\rightarrow v\)的边 那么\(a[u][v]--,a[v][v] ...
- 树链剖分模板(洛谷P3384)
洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...
- 洛谷 P2764 LibreOJ 6002 最小路径覆盖问题
题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...
- BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS
BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...
- 洛谷 P1784 数独[DFS/回溯]
To 洛谷.1784 数独类似题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战) 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- PHP常见方法封装
1.get请求 function get_curl($url, $timeout = 5) { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url) ...
- springboot项目的创建和兼容jsp和注解开发,详细有效(注解和配置两种)
如果这篇博客能给你带来帮助不胜荣幸,如果有不对的地方,都是码农欢迎指正.直接进入正题 在这里首先我要声明一下我个人的感觉如果你会ssm(spring+mybatis+springmvc)的话,那么你可 ...
- Linux,Lnmp配置Index of /索引页
其实很简单就是修改conf配置文件 进入域名对应的vhost修改conf文件: 第一种方法 cd /usr/local/nginx/vhost/ 在清楚当前域名所对用的conf文件可以试用 ll 列出 ...
- React Tree树形结构封装工具类
需要依赖 immutable,用于group by分组 buildTree 为入口方法,注意返回的是Immutable.List对象,使用需要调用.toJS()方法转为普通对象 其中 creatNod ...
- 5. nginx跨域配置
1.跨域问题处理:在nginx相关接口上配置如下: 如接口有自己的请求头,则加上:如接口自带请求头pubacc-buid if ($request_method = "OPTIONS&quo ...
- 2.5 OpenEuler 中C与汇编的混合编程
2.5 OpenEuler 中C与汇编的混合编程 任务详情 在X86_64架构下实践2.5中的内容,提交代码和实践截图 把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图 任务一x8 ...
- Word运行 没有注册类
启动Word时出现Microsoft Visual Baisc窗口报错,提示"运行时错误 没有注册类""运行时错误 424 要求对象" 删除路径为 C:\用户\ ...
- idea的操作快捷键
IDEA调试快捷键 F8 跳到下一步 相当于eclipse的F6 F7 进入到方法 相当于eclipse 的F7 F9 恢复程序到下一个断点 相当于eclispe的 进入下一个断点 shift+F8 ...
- 【Pr】如何将音频剪成多段批量导出
如何将音频剪成多段批量导出 需要软件: Pr, Adobe Media Encoder (时间线窗口中) 用剃刀将音频割成多段 (时间线窗口中) 选中音频右键 | 嵌套 | 输入名字 (嵌套快捷键:A ...
- path.resolve和path.resolve的用法
前言:要搞清楚path.join()和path.resolve的具体作用,最好自己搞个文件,用node跑一遍去测试一下.只有自己亲自动手实践了,才知道具体是怎么回事,才能真正的理解 一.path.jo ...