所谓 BSGS,就是北上广深。

(逃)

BSGS

给出 a,b,pa,b,pa,b,p,请处出满足 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的最小非负正数解或者报告无解。
a,b,p≤109,gcd⁡(a,p)=1a,b,p\le 10^9,\gcd(a,p)=1a,b,p≤109,gcd(a,p)=1

由于 a,pa,pa,p 互质,有 aφ(p)≡1(modp)a^{\varphi(p)}\equiv 1\pmod paφ(p)≡1(modp),所以答案如果存在,不会超过 O(p)O(p)O(p) 级别。
设 w=⌈p⌉w=\lceil \sqrt{p} \rceilw=⌈p​⌉,xxx 可以拆分为 xw−y(x,y≤p)xw-y \pod {x,y\le \sqrt p}xw−y(x,y≤p​)。
变一下型:
axw−y≡b(modp)a^{xw-y}\equiv b\pmod paxw−y≡b(modp)
axw≡b⋅ay(modp)a^{xw}\equiv b\cdot a^y\pmod paxw≡b⋅ay(modp)
先枚举右边存到 map 或者哈希表里,然后左边暴力查表即可。

ll bsgs(ll a,ll b,ll mod){if(b==0&&a==0) return 1;if(b==1) return 0;if(a==0||b==0) return -1;mp.clear();ll w=ceil(sqrt(mod)),ans=1e16;for(ll i=0,now=1;i<=w;i++,now=now*a%mod){int x=b*now%mod;mp.ins(x,i);}ll bas=ksm(a,w,mod);for(ll i=1,now=bas;i<=w;i++,now=now*bas%mod){int o=mp.find(now);if(o!=-1) ans=min(ans,i*w-o);}return ans>1e15?-1e9:ans;
}

exBSGS

给出 a,b,pa,b,pa,b,p,请处出满足 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的最小非负正数解或者报告无解。
a,b,p≤109a,b,p\le 10^9a,b,p≤109

没有 a,pa,pa,p 互质的条件,之前的算法行不通了。
因此我们要试图转化为互质的情况。

一个朴素的想法是同时除以 gcd⁡\gcdgcd。
但是我们如果改变了 aaa,后面会很难搞。
有一个性质,如果有:
a≡b(modp)a\equiv b\pmod pa≡b(modp)
那么对于 a,b,pa,b,pa,b,p 的公因数 ggg,有:
ag≡bg(modpg)\frac{a}{g}\equiv \frac{b}{g}\pmod {\frac{p}{g}}ga​≡gb​(modgp​)
带回方程:
ax−1⋅ag≡bg(modpg)a^{x-1}\cdot\frac{a}{g}\equiv \frac{b}{g}\pmod {\frac{p}{g}}ax−1⋅ga​≡gb​(modgp​)
ax−1≡bg⋅ag(modpg)a^{x-1}\equiv \frac{b}{g\cdot\frac{a}{g}}\pmod {\frac{p}{g}}ax−1≡g⋅ga​b​(modgp​)
就对方程完成了转化。
但是,这样只是对 ppp 除 ggg 后,依然有可能 p,ap,ap,a 不互质。
那么我们就找到新的 ggg,直到互质为止。
假设除了 kkk 次,就有:
ax−k≡b(∏kgk)⋅∏kagka^{x-k}\equiv \frac{b}{(\prod_kg_k)\cdot\prod_k\frac{a}{g_k}}ax−k≡(∏k​gk​)⋅∏k​gk​a​b​
右边的分母在实现时是分开除的,所以这里也不化简了)
但是我们需要注意一些细节问题。

  1. 如果 gcd⁡(a,p)\gcd(a,p)gcd(a,p) 不是 bbb 的因子怎么办?

如果 a,pa,pa,p 是 ggg 的倍数,那么 axmodpa^x\bmod paxmodp 必然也是 ggg 的倍数(可以把取模理解成减倍数来考虑),那么既然无解。(除非 b=1 !

  1. ppp 不是质数,如何求 ∏kagk\prod_k\frac{a}{g_k}∏k​gk​a​ 的逆元?

如果 a,pa,pa,p 互质,那么 ∏kagk\prod_k\frac{a}{g_k}∏k​gk​a​ (也就是 aaa 的一堆因子乘起来)必然也与 ppp 互质,用 exgcd\mathrm{exgcd}exgcd 求解即可。

代码

inline ll ksm(ll x,ll k,ll mod){//快速幂ll res(1);while(k){if(k&1) res=1ll*x*res%mod;x=1ll*x*x%mod;k>>=1;}return res;
}
struct node{int to,nxt;
};
struct Hash{//哈希表int mod,key[N],val[N],tot,cnt;bool vis[N];  vector<int> exi;int fi[N];node p[N];inline void init(int x){mod=x;memset(fi,-1,sizeof(fi));cnt=-1;}void ins(int k,int w){int o=k%mod;if(!vis[o]){vis[o]=1;exi.push_back(o);}for(int i=fi[o];~i;i=p[i].nxt){int to=p[i].to;if(key[to]==k){val[to]=w;return;}}++tot;val[tot]=w;key[tot]=k;p[++cnt]=(node){tot,fi[o]};fi[o]=cnt;}int find(int k){int o=k%mod;for(int i=fi[o];~i;i=p[i].nxt){int to=p[i].to;if(key[to]==k) return val[to];}    return -1;}void clear(){for(int x:exi){fi[x]=-1;vis[x]=0;}tot=0;cnt=-1;exi.clear();return;}
}mp;
ll bsgs(ll a,ll b,ll mod){if(b==0&&a==0) return 1;if(b==1) return 0;if(a==0||b==0) return -1;mp.clear();ll w=ceil(sqrt(mod)),ans=1e16;for(ll i=0,now=1;i<=w;i++,now=now*a%mod){int x=b*now%mod;mp.ins(x,i);}ll bas=ksm(a,w,mod);for(ll i=1,now=bas;i<=w;i++,now=now*bas%mod){int o=mp.find(now);if(o!=-1) ans=min(ans,i*w-o);}return ans>1e15?-1e9:ans;
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}//gcd
ll exgcd(ll x,ll y,ll &a,ll &b){//exgcdif(!y){a=1;b=0;return x;}ll g=exgcd(y,x%y,a,b),tmp=a;a=b;b=tmp-x/y*b;return g;
}
ll inv(ll x,ll mod){//x的逆元ll a,b;ll g=exgcd(x,mod,a,b);assert(g==1);a=(a%mod+mod)%mod;return a;
}
ll a,b,w;
ll ans=1e18;
ll exbsgs(ll a,ll b,ll mod){//exbsgsif(b==1||mod==1) return 0;ll k(0),g=gcd(a,mod),na=1;while(g>1){++k;    if(b%g) return -1;b/=g;mod/=g;na=na*a/g%mod;g=gcd(mod,a);if(b==na) return k;//此时b变成了1}return bsgs(a,b*inv(na,mod)%mod,mod)+k;
}

模板:BSGS(数论)相关推荐

  1. 亿些模板【数论数学】

    文章目录 前言 数论数学模板 GCD exgcd 快速幂 线性推逆元 线性推逆元(非连续) 逆元求组合数 矩阵乘法 线性筛素数-埃氏筛 线性筛素数-线性筛 线性筛欧拉-埃氏筛 线性求欧拉 龟速乘 FF ...

  2. 线性求逆元模板_ACM 数论基本模板

    ACM 数论基本模板 1.欧几里得 求最大公约数,最小公倍数 (1)递归的写法:int gcd(int a,int b) {return b?gcd(b,a%b):a;} (2)辗转相除法: int ...

  3. 模板 - 数学 - 数论 - 莫比乌斯反演 - 2

    新东西: 求$\sum\limits_{i=1}^{n}|\mu(i)|$ 根据莫比乌斯函数的性质,实际上就是求$\sum\limits_{i=1}^{\lfloor\sqrt{n}\rfloor}\ ...

  4. [模板] BSGS/扩展BSGS

    简介 前置知识: 快速幂&&O(1)快速乘 [模板] 数学基础:快速幂/乘/逆元/exGCD/(ex)CRT/(ex)Lucas定理 转载于:https://www.cnblogs.c ...

  5. P3846-[TJOI2007]可爱的质数【BSGS,数论】

    正题 题目链接:https://www.luogu.org/problemnew/show/P3846 题目大意 BL≡N(modP)B^L\equiv N(mod\ P)BL≡N(mod P) 求最 ...

  6. 模板 - 数学 - 数论

    快速幂 //快速幂 x^n%p ll qpow(ll x,ll n){ll res=1;while(n){if(n&1) res=res*x%p;x=x*x%p;n>>=1;}re ...

  7. [模板] - 快速数论变换 - 航神的传家宝

    #include<bits/stdc++.h> using namespace std; const int mod = (479<<21)+1; const int g = ...

  8. NOI数学:大步小步(Baby Step Giant Step,BSGS)算法

    BSGS算法求 高次同余方程:1.可爱的质数 2.计算器 BSGS算法求 高次同余方程:1.可爱的质数 2.计算器_啦啦啦32421的博客-CSDN博客 大步小步算法(BSGS)及扩展 & b ...

  9. 『ACM』ACM模板合集

    写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...

  10. 第十二届_国赛蓝桥杯个人模板_基础篇

    第十二届_国赛蓝桥杯个人模板_网格图_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_全排列_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_DP篇 第十二届_国赛蓝桥杯个人模板_数论篇 第十二届_国 ...

最新文章

  1. [Spring 深度解析]第6章 Spring的IoC容器系列
  2. [转载]IT知识体系结构图
  3. BCH零确认和比特币RBF该怎么选?
  4. CGContextRef学习笔记
  5. python爬虫爬图片教程_Python爬虫入门教程 5-100 27270图片爬取
  6. 【转】贴片电阻的工作寿命
  7. 卸料装置弹性零件的计算方法_冲裁力、卸料力及推件力的计算-常见问题.doc
  8. 搭建Mock Server
  9. 基于Spring Boot配置文件的日志记录示例样本
  10. [编程题] 按照左右半区的方式重新组合单链表
  11. 在已有数据的linkedList和arrayList集合中在中间位置新插入一条数据谁更快
  12. 让这家有12万名员工、1.7万种产品的钢铁厂平滑上云的黑科技是什么?
  13. 手写哈希(实现简单的加数、查询)
  14. Effective C++ Notebook
  15. Electron入门宝典(三)菜单快捷键
  16. dw css定位,Dreamweaver中层的定位
  17. 程序员思维僵化_僵化趋势
  18. AICON分论坛 | 昇思MindSpore探索人工智能发展新路径
  19. uni-app开发流程一(项目搭建)
  20. 贾立平是中科学院计算机所博士,在思考中砥砺前行——记我校计算机与软件工程学院青年教师王晓明博士...

热门文章

  1. java序列化有什么用_java中序列化的作用
  2. 制作oracle11g yum源,利用安装盘简单制作yum源
  3. gif分解工具_Python之GIF图倒放,沙雕快乐源泉
  4. c语言计算文件摘要值,c语言文件操作摘要.ppt
  5. php判断数组下标,php判断json或者数组格式与给定格式是否一致
  6. html 去除max-height,HTML Style maxHeight用法及代码示例
  7. idea如何导入java工程_Eclipse java web项目 ,导入IntelliJ IDEA 完整操作!
  8. Java当中TreeMap用法
  9. [SpringBoot2]容器功能_底层注解配置绑定_@Configuration@Import@Conditional@ImportResource
  10. [JavaWeb]web相关概念回顾