题目

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协议的更多相关文章

  1. P4454 [CQOI2018]破解D-H协议

    链接 这题并不难只是需要把题读懂 - By ShadderLeave 一句话题意 给定两个数 \(p\)和\(g\),有\(t\)组询问,每组询问给出\(A\)和\(B\) 其中 A = \(g^a ...

  2. 洛谷P4462 [CQOI2018]异或序列(莫队)

    题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...

  3. 洛谷P4358密钥破解 [CQOI2016] 数论

    正解:数论 解题报告: 先,放个传送门QwQ 这题难点可能在理解题意,,, 所以我先放个题意QAQ 大概就是说,给定一个整数N,可以被拆成两个质数的成绩p*q,然后给出了一个数e,求d满足e*d=1( ...

  4. 洛谷P4462 [CQOI2018]异或序列(莫队)

    打广告->[这里](https://www.cnblogs.com/bztMinamoto/p/9538115.html) 我蠢了…… 如果$a_{l} xor ...a_{r}=k$,那么只要 ...

  5. 洛谷4455 [CQOI2018]社交网络 (有向图矩阵树定理)(学习笔记)

    sro_ptx_orz qwq算是一个套路的记录 对于一个有向图来说 如果你要求一个外向生成树的话,那么如果存在一个\(u\rightarrow v\)的边 那么\(a[u][v]--,a[v][v] ...

  6. 树链剖分模板(洛谷P3384)

    洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...

  7. 洛谷 P2764 LibreOJ 6002 最小路径覆盖问题

    题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...

  8. BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS

    BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...

  9. 洛谷 P1784 数独[DFS/回溯]

    To 洛谷.1784 数独类似题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战) 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行 ...

  10. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. gitignore文件中忽略项不起作用的解决方法

    在使用git的时候会遇到这样的情况,我们生产的一些class或者target的目录,我不能提交,这个时候我们需要使用gitignore,但是有的时候虽然添加了,但是不起作用. 情况:开发过程中,我们自 ...

  2. vue vite 打包开启 gzip 部署 nginx 支持 gzip

    vite 打包开启 gzip 安装插件 npm i vite-plugin-compression --save-dev vite.config.js 配置 import { defineConfig ...

  3. 【SQL Server】按日期分组产品

    1 SELECT sell_date ,COUNT(1) AS num_sold, 2 STUFF(( 3 SELECT ',' + son.product 4 FROM (SELECT DISTIN ...

  4. 蓝牙mesh组网实践(手机配网例程配合wch mesh手机app的使用)

    目录 CH582的官方EVT在22年7月更新后,修改了手机配网代码以支持wch mesh手机app.使用该app可以保存手动配网信息,设置订阅地址分组,OTA升级,极大方便了用户管理节点. 老版本的E ...

  5. linux下生成证书

    1.生成私有证书 # 生成需要密码的密钥文件server.key openssl genrsa -des3 -out server.key 2048 # 转成不用密码的rsa密钥文件 openssl ...

  6. JAVA JAR包注册成服务,开机启动,WINSW使用

    1,下载工具 WINSW. https://www.aliyundrive.com/s/fACj3xk8R74 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画 ...

  7. 【C++】fstream文件操作

    C语言使用FILE对文件进行操作,常用到的函数有fopen().freopen().fread().fwrite().fclose()等,分别用来打开文件.读写文件.关闭文件. C++可以使用fstr ...

  8. Java集合-Set接口

    Set接口-介绍 Set接口的定义如下: Set是一个继承于Collection的接口,即Set也是集合中的一种.Set是没有重复元素的集合.即: Set 接口:无序,不支持索引,不可重复的集合 Se ...

  9. 【电路理论】Flyback dc-dc convertor 反激式dc-dc变换器

    最近在学dc-dc电源时,遇到Flyback电路的,感觉云里雾里,不太明白,四处翻阅,方才有所理解,记录一下 一般Flyback convertor的拓扑如下 认为,当VT导通时,原边变压器储能,由于 ...

  10. 网络协议及osi模型

    osi模型:由高到底 应用层:最高一层,是用户与网络的接口 表示层: 会话层: 传输层:作用是为上层协议提供端到端的可靠和透明的数据传输服务 网络层: 数据链路层: 物理层:它利用传输介质为数据链路层 ...