先谈一下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. 3.4 复杂的x86指令举例

    计算机组成 3 指令系统体系结构 3.4 复杂的x86指令举例 x86作为复杂指令系统的代表,自然会有不少相当复杂的指令.在这一节我们将会看到其中有代表性的一些例子. 关于复杂的x86指令,我们这里举 ...

  2. LeetCode--088--合并两个有序数组

    方法1: class Solution(object): def merge(self, nums1, m, nums2, n): """ :type nums1: Li ...

  3. 12月13日 什么是help_method,session的简单理解, find_by等finder method

    helper_method Declare a controller method as a helper. For example, helper_method :link_to def link_ ...

  4. PHP函数总结 (五)

    <?php /** * 回调函数: * 指调用函数时并不是传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中 * 使用回调函数可以 将一段自己定义的功能传到函数内部使用 * ...

  5. memcpy详解

    头文件:#include<string.h>函数原型:void *memcpy(void str,const void *s,size_t n); 功能 c和c++使用的内存拷贝函数.从源 ...

  6. 在linux下出现cannot restore segment prot after reloc: Permission denied

    应用程序连接oracle的库时会出现如下错误:XXXXX:: error while loading shared libraries: /usr/local/oracle/product/10.2. ...

  7. 33. 81. Search in Rotated Sorted Array *HARD*

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. 对称点line

    2 线 题⽬描述 有一天rax看到了男神,有时可爱美丽的她派ypq去把yyqx抓回来给rax欣赏,但ypq和yyqx间隔了一条线,她必须跳到yyqx以前待得点的对称点才有可能抓到yyqx给出⼀条直线, ...

  9. Rancher 企业级docker管理平台

    启动Rancher 加入ca证书: docker run -d  --restart=unless-stopped -p 8080:8080 -v /root/cacert.crt:/var/lib/ ...

  10. linux下安装nodejs及cnpm

    http://www.runoob.com/nodejs/nodejs-install-setup.html https://www.cnblogs.com/zqzjs/archive/2017/01 ...