链接

这题并不难只是需要把题读懂 — By ShadderLeave

一句话题意

给定两个数 \(p\)和\(g\),有\(t\)组询问,每组询问给出\(A\)和\(B\)

其中 A = \(g^a \bmod p\) B = \(g^b \bmod p\)

问你\(g^{ab} \bmod p\)是多少。

初步解法就是用BSGS求出每个\(a\),\(b\)在用快速幂算出\(g^{ab} \bmod p\)

可实际上你就会发现只要算一个就行。

算出\(a\)直接求出\(B^a \bmod p\)就是答案

然鹅,就这样交上去你就会狂TLE

所以,我们只能再考虑优化。

每次询问,我们都会把map清空,并重新储存,但这样会浪费很多时间,那我们从这开始优化

我们要求的是这个柿子 \(g^a \equiv A\)

我们利用BSGS的思想可以把它化为 \(g^{kt+b} \equiv A\)

也就是\(g^{kt} \equiv A \times g^B\)

发现方程右边会随A的取值发生变化,但左边的g和t确定了,那么值就不会变。

所以,我们可以预先处理出\(g^{kt}\)并把他插入map中。

对于每组询问,枚举\(A \times g^j\) 看在map中是否出现过。

如果出现过,答案就是 map中的存的幂指数 - \(j\)

但有一个很大的问题就是:

卡 。。。常 。。。。

卡。。。。。常。。。。

卡。。。。。。常。。。。。

毒瘤出题人nmsl

所以我们只能少用快速幂,再求\(g^{kt}\)以及\(g^j\)只能用累乘的方法来求。

出题人我*****

代码


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
#define LL long long
int g,t,p,A,B;
map<LL,int> hash;
inline LL read()
{
LL s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s= s * 10+ch - '0'; ch = getchar();}
return s * w;
}
LL ksm(LL a,LL b)
{
LL res = 1;
for(; b; b >>= 1)
{
if(b & 1) res =res * a % p;
a = a * a % p;
}
return res;
}
void YYCH()//预处理出g^kt
{
LL t = sqrt(p) + 1;
LL base = ksm(g,t); LL tmp = 1;
for(int i = 1; i <= t; i++)
{
tmp = tmp * base % p;//累乘避免被卡常
hash[tmp] = i * t;
}
}
LL BSGS(int k)
{
LL t = sqrt(p) + 1; LL tmp = k;
if(hash[tmp]) return hash[tmp];
for(int i = 1; i < t; i++)//枚举A*g^j
{
tmp = tmp * g % p;
if(hash[tmp]) return hash[tmp] - i;
}
// return -1;
}
int main()
{
g = read(); p = read(); t = read(); YYCH();
while(t--)
{
A = read(); B = read();
printf("%lld\n",ksm(B,BSGS(A)));
}
return 0;
}

我拿出我珍藏多年的卡常火车头,出题人(17张牌你能秒杀我)你要是能卡住我,我当场把屏幕吃掉。

呜呜,我错了,放过我吧,不要再卡我了。

P4454 [CQOI2018]破解D-H协议的更多相关文章

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

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

  2. BZOJ5296 CQOI2018 破解D-H协议 【BSGS】

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

  3. [CQOI2018]破解D-H协议

    嘟嘟嘟 这不就是个bsgs板儿嘛. 顺便就复习了一下bsgs和哈希表. 头一次觉得我的博客这么好用,一下就懂了:数论学习笔记之高次不定方程 这里再补充几点: 1.关于这一段代码: int S = sq ...

  4. BZOJ5296 [CQOI2018] 破解D-H协议 【数学】【BSGS】

    题目分析: 裸题. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; ; #define mp ...

  5. 2018.12.18 bzoj5296: [Cqoi2018]破解D-H协议(bsgs)

    传送门 bsgsbsgsbsgs基础题. 考虑到给的是原根,因此没无解的情况. 于是只需要每次把a,ba,ba,b解出来. 然后可以通过预处理节省一部分时间. 代码: #include<bits ...

  6. LG4454 【[CQOI2018]破解D-H协议】

    先谈一下BSGS算法(传送门) 但是上面这位的程序实现比较繁琐,看下面这位的. clover_hxy这样说 bsgs算法,又称大小步算法(某大神称拔山盖世算法). 主要用来解决 A^x=B(mod C ...

  7. BZOJ 5296: [Cqoi2018]破解D-H协议(BSGS)

    传送门 解题思路 \(BSGS\)裸题??要求的是\(g^a =A (mod\) \(p)\),设\(m\)为\(\sqrt p\),那么可以设\(a=i*m-j\),式子变成 \[ g^{i*m-j ...

  8. 破解使用SMB协议的Windows用户密码:acccheck

    一.工作原理 Acccheck是一款针对微软的SMB协议的探测工具(字典破解用户名和密码),本身不具有漏洞利用的能力. SMB协议:SMB(Server Message Block)通信协议主要是作为 ...

  9. noip考前抱佛脚 数论小总结

    exCRT 求解韩信点兵问题,常见的就是合并不同\(mod\). 先mo一发高神的板子 for(R i=2;i<=n;++i){ ll Y1,Yi,lcm=Lcm(p[i],p[1]); exg ...

随机推荐

  1. Linux+Jenkins自动构建服务器包

    何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...

  2. 2019HNCPC C Distinct Substrings 后缀自动机

    题意 给定一个长度为n字符串,字符集大小为m(1<=n,m<=1e6),求\(\bigoplus_{c = 1}^{m}\left(h(c) \cdot 3^c \bmod (10^9+7 ...

  3. 微服务实战SpringCloud之Spring Cloud Feign替代HTTP Client

    简介 在项目中我们有时候需要调用第三方的API,微服务架构中这种情况则更是无法避免--各个微服务之间通信.比如一般的项目中,有时候我们会使用 HTTP Client 发送 HTTP 请求来进行调用,而 ...

  4. 11 vue 自定义全局方法

    //global.js// 定义vue 全局方   // 定义vue 全局方法 建议自定义的全局方法加_ 以示区分 export default {   install(Vue, options =  ...

  5. 剑指 Offer 19. 正则表达式匹配

    题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  6. shell小技巧(4)AIX和Linux计算天前日期

    Linux计算天前日期: date -d "- day" +%Y%m%d AIX计算5天前日期: perl -e "use POSIX qw(strftime); pri ...

  7. 20190923-13Linux企业真实面试题 000 021

    百度&考满分 问题:Linux常用命令 参考答案:find.df.tar.ps.top.netstat等.(尽量说一些高级命令) 瓜子二手车 问题:Linux查看内存.磁盘存储.io 读写.端 ...

  8. i春秋公益赛之signin

    题目链接:https://buuoj.cn/challenges#gyctf_2020_signin 查看程序保护 只开了canary和NX保护,在IDA查看反编译出来的为代码时发现程序给了一个后门 ...

  9. Python爬Boss,找工作,快人一步!!!

    通过职位搜索"Python开发",看下搜索的结果: https://www.zhipin.com/job_detail/?query=python开发&city=10102 ...

  10. hexo博客front-matter格式

    通用格式 Front-matter 是文件最上方以 --- 分隔的区域,用于指定个别文件的变量,举例来说: --- title: Hello World date: 2013/7/13 20:46:2 ...