当前位置: 首页 > news >正文

BSGS学习笔记

BSGS

一、简介

BSGS支持形如
$$b^l\equiv n \pmod p$$
在$O(\sqrt p)$的时间复杂度能够求得l的大小

二、前置(没有什么意义)

可以观察到,从$b0$到$bp$中,必有一个数是同余的。去掉$b^p$,会有两种情况

1. $b0$到$b$两两不同

可以得到一定有解

2. otherwise

若$b^i \equiv b^j \pmod p$,则有$b^{i-1} \equiv b^{j-1} \pmod p$,可得一定存在循环节(从$b=0$开始)

二、思想

分块

令$t=\sqrt p$,可以得到从0~p-1中被划分为t块。若存在某个$b^l \equiv n \pmod p$,则令两边同时乘上$b^j$。

即得到$b^{tk} \equiv nb^j \pmod p$

对于任意$bl$,一定存在$b \leq b^l < b^{t \cdot k}$,由此可得上文中的$j$存在$0 \leq j < t$。

对于每一个k,我们可以寻找有没有符合条件的j

由此可得,全局只需要处理第一块区间的所有$n*bi$和每一个区间的边界(即每一个$b,0 \leq k < t$)。

综上,对于整个代码只需要$O(\sqrt p)$,(若使用map需要乘上 $\log \sqrt p$ ,hash则不需要)

三、代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
#define int long long
int qpow(int a, int b, int mod){int res = 1ll;while(b){if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
int bsgs(int a, int b, int p){map<int, int> hsh; hsh.clear();if(p == 1) return 0;b %= p;if(b == 1) return 0;int t = ceil(sqrt(p));// 首先要求a^x和b模p同余// a^(i*t)和b*a^j模p同余//此处预处理所有的b*a^jfor(int i = 0ll; i < t; i++) hsh[b * qpow(a, i, p) % p] = i; // BS,即处理0~sqrt(p)的a^i // i=1时的a^(i*t) a = qpow(a, t, p);if(!a){if(b == 0ll) return 1ll;return -1;}for(int i = 1; i <= t; i++){//val是不同的(a^t)^iint val = qpow(a, i, p);int j = 0;// 寻找有没有a^(i*t)和某个b*a^j同余 if(hsh.find(val) != hsh.end()) j = hsh[val];else j = -1;// 存在j且存在i*t-jif(j >= 0 && i * t - j >= 0) return i * t - j;}return -1;
}
int p, b, n;
signed main(){cin >> p >> b >> n;int ans = bsgs(b, n, p);if(ans == -1) cout << "no solution\n";else cout << ans << '\n';return 0;
}

建议自己打一遍(主要就是分块思想,打起来不算难) QvQ

http://www.jsqmd.com/news/593717/

相关文章:

  • 基于 Gemma 2 构建企业级 Agentic RAG 合规审计系统
  • 比话降AI和嘎嘎降AI处理80%+AI率哪个更好
  • 别再问怎么连了!Win10蓝牙串口配对仪器设备,保姆级图文教程(含端口号查看)
  • Xilinx UltraScale Transceiver仿真调试实战:从数据对齐到随机数验证
  • 域名出售页+escrow.com出售链接。(Caddy + Node.js)
  • 预算有限AI率还有80%,性价比最高的降AI方案
  • 在大数据求职的路上,你不是一个人在战斗。
  • 电赛赛题深度解析:从五大类别到实战备赛策略
  • 基于 RO1 noetic 配置 robosense Helios 32(速腾) xsense mti 300
  • 二轮做好题DAY3
  • 国内替代 Claude Code:Qwen 3.6 vs DeepSeek-V3.2 vs MiniMax-M2.7-highspeed
  • 知网检测AI率90%,我用这个方法两天降到12%
  • [算法训练] LeetCode Hot100 学习笔记#19
  • C#并行编程进阶:除了Task和Parallel,你还需要学会用PerformanceCounter做资源熔断
  • 基于STM32的高压无刷直流电机控制程序(含硬件设计与软件实现)
  • 26年春季学期学习记录第18天
  • AI小说创作中的版权与原创性问题解析
  • C# WinForm 工作流设计器:拖拽连线与可视化流程图实现解析
  • Libero Soc v11.9证书环境变量配置详解:LM_LICENSE_FILE、SNPSLMD与SYNPLCTYD一个都不能少
  • 知网维普都要过,AI率85%用哪款工具最合适
  • 0基础教你快速写自己的Agent Skills
  • ROS多机通信实战:手把手教你配置主从机(含SSH远程调试技巧)
  • Harbor集成Trivy实现镜像安全扫描:从安装到离线环境配置全指南
  • 基于Matlab的分布式电源选址定容软件:优化接入点与容量,降低网损与电压越限风险
  • OpenAPI TS工具对比:解决openapi-typescript生成的 联合类型 (Union Type),无法直接对应 Java 后端枚举的问题
  • 数据湖与数据仓库的融合:从架构到实践
  • Unity WebGL小游戏上抖音,从踩坑到上线:一份避坑指南与性能优化清单
  • UI 2026.03.26
  • 毕业党速看:这款 AI 论文神器太疯狂,输入标题直接生成万字长文
  • Python 中的正则表达式:从基础到高级应用