先谈一下BSGS算法(传送门)

但是上面这位的程序实现比较繁琐,看下面这位的。

clover_hxy这样说

bsgs算法,又称大小步算法(某大神称拔山盖世算法)。

主要用来解决 A^x=B(mod C)(C是质数),都是整数,已知A、B、C求x。(poj 2417 Discrete Logging)

具体步骤如下:

先把x=i*m-j,其中m=ceil(sqrt(C)),(ceil是向上取整)。

这样原式就变为A^(i*m-j)=B(mod C),

再变为Aj×B=A(m*i) (mod C)。

枚举j(范围0-m),将A^j×B存入hash表

枚举i(范围1-m),从hash表中寻找第一个满足Aj×B=A(m*i) (mod C)。

此时x=i*m-j即为所求。

在网上看到的其他题解大多用的是x=i*m+j,也可以做,只是会牵扯的求逆元,所以比较麻烦。使x=i*m-j就可以轻松避免这个问题了。

那么肯定有人会有疑问为何只计算到m=ceil(sqrt(C))就可以确定答案呢?

x=i*m-j 也就是x 的最大值不会超过p,那超过p的怎么办 ?

有一个公式 a^(k mod p-1)=a^k (mod p) 这个公式的推导需要用到费马小定理

k mod p-1可以看做 k-m(p-1) ,原式可化成 ak/(a(p-1))m=ak (mod p)

根据费马小定理 a^(p-1)=1 (mod p) 其中p为质数 ,a,p 互质,可得ak/1m=a^k (mod p) ak=ak (mod p) 得证。

分析此题

实际上就是求 g^a = A (mod p) 中的a,于是顺利套出模板

注意,能少用pow我们就少用,尽量减少常数。本来就用了map,到时候被卡常就尴尬了

这题就等于模板题,没有什么特殊的需要处理

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int INF=0x7fffffff;
template<class T> inline T read(T&x){
T data=0;
int w=1;
char ch=getchar();
while(ch!='-'&&!isdigit(ch))
ch=getchar();
if(ch=='-')
w=-1,ch=getchar();
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
ll g,p,bl,A,B;
map <ll,ll> mp; int pow1(ll x,ll k){
ll ans=1;
while(k>0)
{
if(k&1)
ans=(ans*x)%p;
x=(x*x)%p;
k>>=1;
}
return ans;
} void init()
{
bl=ceil(sqrt(p));
ll cur=pow1(g,bl),ans=cur;
mp[ans]=bl;
for(ll i=2;i<=bl;++i)
{
ans=(ans*cur)%p;
mp[ans]=i*bl;
}
} ll BSGS(ll x)
{
ll j=0,cur=1;
for(;j<=bl;++j)
{
if(mp[(cur*A)%p])
return mp[(cur*A)%p]-j;
cur=(cur*g)%p;
}
} int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(g);
read(p);
init();
ll n;
read(n);
while(n--)
{
read(A);
read(B);
printf("%lld\n",pow1(B,BSGS(A)));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

LG4454 【[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. BZOJ 5296: [Cqoi2018]破解D-H协议(BSGS)

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

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

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

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

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

  9. Linux 利用hosts.deny 防止暴力破解ssh(转)

    一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...

随机推荐

  1. LeetCode--198--打家劫舍

    问题描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...

  2. ViewPagerIndicator+viewpager的简单使用,不需要导入Library包

    ViewPagerIndicator作为一款分页指标小部件兼容ViewPager,封装上做得非常不错,目前已为众多知名应用所使用. ViewPagerIndicator+viewpager实现如下效果 ...

  3. Android出现declaration of org.apache.http.message.BasicLineFormatter appears in /system/framework/

    这是由于使用了CloseableHttpClient造成的,把 CloseableHttpClient httpclient = HttpClients.createDefault(); Closea ...

  4. 41 MYSQL 索引和慢查询优化

    一 .索引mysql 索引 b+tree 本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数 ...

  5. XML Publisher Using API’s(转)

    原文地址:XML Publisher Using API’s Applications Layer APIsThe applications layer of XML Publisher allows ...

  6. nginx支持返回相对路径

    一.问题:http://192.168.72.4/bm-crm/  局域网可以访问[实际指向了192.168.80.1:8081/brm-crm] http://59.41.111.24:8280/b ...

  7. 程序中使用7z.exe解压不完整的问题

    今天在代码中使用7x.exe解压一个tar压缩包,完成之后,发现关键性的文件不存在, 再细看发现,很多文件都没解压出来. 经研究,发现是这个压缩包中,有2个文件解压位置一样, 7z.exe在中途弹出提 ...

  8. Hash索引和BTree索引

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  9. POJ 2499 A*求第K短路

    DES就是给你一个图.然后给你起点和终点.问你从起点到终点的第K短路. 第一次接触A*算法. 题目链接:Remmarguts' Date 转载:http://blog.csdn.net/mbxc816 ...

  10. learning uboot switch to standby system using button

    pseudocode: If(reset_button was pressed ) { Change  uboot env bootslot^1 }