• 基础篇
    • 问题:
    • 思路:
    • 模板:
    • 题目:

基础篇

问题:

给出 a , b , p a,b,p a,b,p,其中 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1,求 x x x满足
a x ≡ b ( m o d p ) a^x\equiv b(mod~p)\\ ax≡b(mod p)

思路:

设 x = A p − B x=A\sqrt p-B x=Ap ​−B其中 A ∈ [ 1 , p ] , B ∈ [ 0 , p ] A\in[1,\sqrt p],B\in[0,\sqrt p] A∈[1,p ​],B∈[0,p ​],得到问题的变形
a A p − B ≡ b ( m o d p ) a A p ≡ b a B ( m o d p ) a^{A\sqrt p-B}\equiv b(mod~p)\\ a^{A\sqrt p}\equiv ba^B(mod~p)\\ aAp ​−B≡b(mod p)aAp ​≡baB(mod p)
我们先枚举 B B B,算出每个 b a B m o d p ba^B~mod~p baB mod p,用 u n o r d e r e d _ m a p unordered\_map unordered_map存起来,再枚举 A A A,计算出 a A p a^{A\sqrt p} aAp ​,在 u n o r d e r e d _ m a p unordered\_map unordered_map中找相同的值,这样的 A , B A,B A,B就能恰好凑成一对答案。复杂度 O ( p ) O(\sqrt p) O(p ​),如果用 m a p map map的话,就多一个 l o g log log。

模板:

unordered_map<ll, ll> mp;
ll bsgs(ll a, ll b, ll p) {if(a % p == 0) return -1;mp.clear();ll k = ceil(sqrt(p));for(int i=0; i<=k; i++) {mp[b] = i;b = b * a % p;}ll aa = qpow(a, k, p), A = aa;for(int i=1; i<=k; i++) {if(mp[aa]) {return 1ll * i * k - mp[aa] + 1;}aa = aa * A % p;}return -1;
}

题目:

[TJOI2007]可爱的质数/模板BSGS

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<ll, ll> mp;
ll qpow(ll x, ll y, ll mod) {ll ans = 1;while(y) {if(y & 1) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}
ll bsgs(ll a, ll b, ll p) {if(a % p == 0 && b != 0) return -1;mp.clear(); ll k = ceil(sqrt(p));for(int i=0; i<=k; i++) {mp[b] = i;b = b * a % p;}ll aa = qpow(a, k, p), A = aa;for(int i=1; i<=k; i++) {if(mp[A]) {return 1ll*i*k-mp[A];}A = A * aa % p;}return -1;
}
int main() {#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endif  ll a, b, p;cin >> p >> a >> b;ll ans = bsgs(a, b, p);if(ans == -1) cout << "no solution";else cout << ans;return 0;
}

P2485 [SDOI2011]计算器
快速幂+扩展欧几里得+bsgs。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 0x7fffffff;
unordered_map<int, int> mp;
int qpow(int x, int y, int mod) {int ans = 1;while(y) {if(y & 1) ans = 1ll * ans * x % mod;x = 1ll * x * x % mod;y >>= 1;}return ans;
}
int exgcd(int &x, int &y, int a, int b) {if(b == 0) {x = 1, y = 0;return a;}int d = exgcd(x, y, b, a%b);int tmp = y;y = x-a/b*y;x = tmp;return d;
}
signed main() {#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifint n, k;cin >> n >> k;for(int i=1; i<=n; i++) {int y, z, p;cin >> y >> z >> p;if(k == 1) cout << qpow(y, z, p) << endl;else if(k == 2) {int u, v;int d = exgcd(u, v, y, p);if(z % d) puts("Orz, I cannot find x!");else {int l = p/d, r = z / d;cout << (1ll * (r % l) * (u % l) % l + l) % l << endl;}}else {mp.clear();if(y % p == 0 && z % p) {puts("Orz, I cannot find x!");continue;}int now = z%p, m = ceil(sqrt(p)), f = 0;mp[now] = 0;for(int i=1; i<m; i++) {now = now * y % p;mp[now] = i;}now = 1;int A = qpow(y, m, p);for(int i=1; i<=m; i++) {now = now * A % p;if(mp.count(now)) {cout << ((i*m - mp[now]) % p + p) % p << endl;f = 1;break;} }if(!f) puts("Orz, I cannot find x!");}}return 0;
}

BSGS(基础篇,题目+详解)相关推荐

  1. 【基础篇】详解Zookeeper客户端Curator

    一.前言 Zookeeper被广泛应用于分布式环境下各种应用程序的协调,而Curator无疑是Zookeeper客户端中的瑞士军刀,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重 ...

  2. java基础代码实例_基础篇:详解JAVA对象实例化过程

    1 对象的实例化过程 对象的实例化过程是分成两部分:类的加载初始化,对象的初始化 要创建类的对象实例需要先加载并初始化该类,main方法所在的类需要先加载和初始化 类初始化就是执行方法,对象实例化是执 ...

  3. groovy 字符串截取最后一个_Java基础篇——字符串详解

    字符串的声明 字符串是内存中连续排列的0个或多个字符.不变字符串是指字符串一旦创建,其内容就不能改变,Java中使用String类来处理不变字符串,在对String类的实例进行查找.比较.拼接等操作时 ...

  4. Linux系统编程3:基础篇之详解Linux软件包管理器yum

    文章目录 (1)什么是软件包 A:软件包 B:注意事项 C:yum基本使用 (2)安装rzsz (1)什么是软件包 A:软件包 区别Windows,在Linux下安装软件,第一种方法是下载程序源代码, ...

  5. Linux系统编程2:基础篇之详解Linux中的权限问题

    文章目录 权限 (1)超级用户和普通用户 (2)Linux权限管理 A:文件访问者的分类 B:文件类型和访问权限 A:文件类型 B:基本权限 C:权限的表示方法 D:权限的设置 E:粘滞位 补: 权限 ...

  6. Java基础篇------抽象类详解

  7. 【高级篇】详解Zookeeper客户端Curator

    一.序言 之前分享过一篇关于Curotor的基本应用[基础篇]详解Zookeeper客户端Curator,如果对Curator没有了解的可以看看,本文分享关于Curator的一些高级特性,在监听和le ...

  8. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  9. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  10. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. php 判断手机和电脑,php 判断是手机版还是电脑端
  2. [UE4]瞬移前后屏幕亮度变化,Get Player Camera Manager.Start Camera Fade
  3. Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)
  4. 洛谷 - P2762 太空飞行计划问题(最大权闭合图+路径打印)
  5. linux yum的用法【ZT】
  6. 为了在简历上写掌握【Java集合】,做了万字总结
  7. JS日期前后一天方法
  8. 台州市建筑物矢量数据(Shp格式+带高度)
  9. 大一作业HTML网页作业:中华传统文化题材网页设计5页(纯html+css实现)
  10. 软件分享之浏览器部分
  11. Java 16进制求和
  12. (基础)选择器的语法
  13. Xmake v2.7.1 发布,更好的 C++ Modules 支持
  14. 基于Jetson AGX Xavier GMSL9296硬件设计与软硬件调试
  15. Unity技术手册 - 粒子基础主模块属性-中
  16. Linux怎样低格移动硬盘,移动硬盘低级格式化操作方法详细步骤【图文详解】
  17. windows系统下安装深度系统deepin
  18. 【爬虫】python使用selenium抓取淘宝中的商品数据
  19. html清除浮动标签,页面布局的排列规则是什么?怎样清除浮动标签?
  20. 马未都:人生三重境界

热门文章

  1. 【学习笔记】GAN--李宏毅(上)
  2. 第六课 大数据技术之Fink1.13的实战学习-Table Api和SQL
  3. 大漠多账号循环登录任务自动切换模板读取账号到超级列表框
  4. 前端 cross-env 实现vue项目多环境打包
  5. 不懂内链这5方面,不要说你真正了解网站内链!
  6. 【HaaS Python硬件积木】ULN2003A步进电机驱动
  7. matlab立体坐标定位_matlab中三维图形最值点坐标?
  8. ios中html怎么横屏,iOS如何实现强制转屏、强制横屏和强制竖屏的实例代码
  9. HEVC代码学习39:decodeCtu和xDecodeCU函数
  10. 股票的最大利润(JS)