嘟嘟嘟




这不就是个bsgs板儿嘛。

顺便就复习了一下bsgs和哈希表。

头一次觉得我的博客这么好用,一下就懂了:数论学习笔记之高次不定方程




这里再补充几点:

1.关于这一段代码:

int S = sqrt(c), p = 1;
for(int i = 0; i < S; ++i)
{
if(p == b) return i + cnt;
insert(1LL * p * b % c, i);
p = 1LL * p * a % c;
}
for(int i = S, q = p; i - S + 1 < c; i += S)
{
int t = query(q);
if(~t) return i - t + cnt;
q = 1LL * q * p % c;
}

这一段是bsgs里最核心的部分。

首先是为什么\(q\)每一次乘以\(p\):第一层循环后,\(p\)就成为了\(a ^ m\),这样就相当于\(a ^ {i * m}\)。

然后是第二层循环的终止条件为什么是这个:大家都知道,这一段代码是枚举\(a ^ {tm}\)的,只不过用\(i\)代替了\(tm\),所以我们考虑\(i\)的最大值:\(tm - y < c \Rightarrow i - (m - 1) < c \Rightarrow i - m + 1 < c\) 。这就出来了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int base = 99979;
const int maxe = 1e6 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int g, P, n; In ll quickpow(ll a, ll b, ll mod)
{
ll ret = 1;
for(; b; b >>= 1, a = a * a % mod)
if(b & 1) ret = ret * a % mod;
return ret;
}
In ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
In void exgcd(ll a, ll b, ll& x, ll& y)
{
if(!b) x = 1, y = 0;
else exgcd(b, a % b, y, x), y -= a / b * x;
} In ll inv(ll a, ll mod)
{
ll x, y;
exgcd(a, mod, x, y);
return x;
} struct Hash
{
int nxt, to, w;
}e[maxe];
int head[base], ecnt = 0;
int st[base], top = 0;
In void init()
{
ecnt = 0;
while(top) head[st[top--]] = 0;
}
In void insert(int x, int y)
{
int h = x % base;
if(!head[h]) st[++top] = h;
e[++ecnt] = (Hash){head[h], x, y};
head[h] = ecnt;
}
In int query(int x)
{
int h = x % base;
for(int i = head[h]; i; i = e[i].nxt)
if(e[i].to == x) return e[i].w;
return -1;
} In int bsgs(int a, int b, int c)
{
int Gcd, d = 1, cnt = 0;
while((Gcd = gcd(a, c)) ^ 1)
{
if(b % Gcd) return -1;
++cnt; b /= Gcd, c /= Gcd;
d = 1LL * d * (a / Gcd) % c;
}
b = 1LL * b * inv(d, c) % c;
init();
int S = sqrt(c), p = 1;
for(int i = 0; i < S; ++i)
{
if(p == b) return i + cnt;
insert(1LL * p * b % c, i);
p = 1LL * p * a % c;
}
for(int i = S, q = p; i - S + 1 < c; i += S)
{
int t = query(q);
if(~t) return i - t + cnt;
q = 1LL * q * p % c;
}
return -1;
} int main()
{
g = read(), P = read(), n = read();
for(int i = 1; i <= n; ++i)
{
int A = read(), B = read();
write(quickpow(g, 1LL * bsgs(g, A, P) * bsgs(g, B, P) , P)), enter;
}
return 0;
}

[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. BZOJ5296 [CQOI2018] 破解D-H协议 【数学】【BSGS】

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

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

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

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

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

  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. RabbitMQ 基本概念总结

    1.ack模式-应答模式 执行一个任务可能需要花费几秒钟,你可能会担心如果一个消费者在执行任务过程中挂掉了.一旦RabbitMQ将消息分发给了消费者,就会从内存中删除.在这种情况下,如果正在执行任务的 ...

  2. 微信wx.request

    官方 wx.request 代码,Post 没成功过,使用Get 方式成功了. wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' ...

  3. 广州地区.net相关活动的文章

    此文正在更新中... 复活广州.net俱乐部 office365的开发者训练营,免费,在微软广州举办 被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

  4. 也说Socket

    网上有大量socket相关文章,茫茫多,大多交代不清,最近自我整理了一下socket相关知识,附加了大量代码注释,先看效果. 上代码,客户端: Socket socket1 = null;//一个全局 ...

  5. iOS---------Xcode中添加预编译pch文件

    第一步:打开项目,com+N,将页面滑动最下面如图 第二步:创建pch文件 第三步:修改buildsetting配置文件       在搜索框里输入prefix搜索一下,比较好找      1.将Pr ...

  6. python安装小结

    一.python下载地址:http://www.activestate.com/activepython/downloads 二.1.没有安装request会出一下错误: 2.解决办法:pip ins ...

  7. Testlink1.9.17使用方法(第十一章 其他易用性功能)

    第十一章 其他易用性功能 QQ交流群:585499566 一. 自定义 一). 自定义字段管理 在主页点击[自定义字段管理]按钮-->进入自定义字段管理页面,点击[创建]按钮,可以创建一个字段, ...

  8. (后端)mybatis中使用Java8的日期LocalDate、LocalDateTime

    原文地址:https://blog.csdn.net/weixin_38553453/article/details/75050632 MyBatis的型处理器是属性“createdtime参数映射为 ...

  9. C# 代码中调用 Javascript 代码段以提高应用程序的配置灵活性(使用 Javascript .NET 与 Jint)

    一般来说,我们需要在开发应用软件的配置文件中,添加一些参数,用于后续用户根据实际情况,自行调整. 配置参数,可以放在配置文件中.环境变量中.或数据库表中(如果使用了数据库的话).通常,配置数据,以 k ...

  10. log4j.properties配置说明

    log4j.properties配置说明 1. log4j配置 # ALL,DEBUG,INFO,WARN,ERROR,FATAL,OFF LOG_LEVEL=INFO log4j.rootLogge ...