用于求解形如\(a^x≡b\mod p\)的最小非负整数解\(x\).

由欧拉定理\(a^{\phi(p)}≡1\mod p\)可以知道,我们找的解如果有解则一定在\(\phi(p)\)范围内,而最大的范围就是当\(p\)为质数时,等于\(p-1\).

一种暴力方法是枚举指数验证。由于\(gcd(a,p)=1\).则\(a\)在\(\mod p\)意义下必有逆元。所以,我们考虑分解一下质数的表示形式。

知道最大范围不超过\(p\),所以我们令\(x=i*m-j\),将\(a^{-j}\)移项到左边,变成\(a^{i*m}≡b*a^j\mod p\).这里\(m=\lceil{\sqrt{p}}\rceil\).

我们枚举\(b*a^j\),把它们\(\mod p\)的值插入到\(\text{Hash}\)表里面。我们再枚举\(a^{i*m}\),如果这个值在\(\text{Hash}\)表里面出现过,则跳出循环,输出答案。

特判无解,一是没有找到解,另一个是无解,即\(a\mod p=0,b!=0\),或是\(a=0\)的时候。(就那几个特殊情况)

这就是\(BSGS\)的基本思路。下面是\(\text{fast_power,Exgcd,BSGS}\)的三合一模板。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
int mul(int a,int b,int p){return (1ll*a*b)%p;}
int add(int a,int b,int p){return (1ll*a+b)%p;}
int qpow(int a,int b,int p){
int res=1;
while(b){
if(b&1)res=mul(res,a,p);
a=mul(a,a,p);b>>=1;
}
return res;
}
int Exgcd(int a,int b,int &x,int &y){
if(!b){x=1,y=0;return a;}
int res=Exgcd(b,a%b,x,y);
int tmp=x;x=y;y=tmp-a/b*y;
return res;
}
map<ll,ll>mp;
int T,opt;
signed main(){
scanf("%lld%lld",&T,&opt);
for(;T;--T){
int y,z,p;
scanf("%lld%lld%lld",&y,&z,&p);
if(opt==1)printf("%lld\n",qpow(y,z,p));
else if(opt==2){
int x,yy;
int G=Exgcd(y,p,x,yy);
if(z%G){puts("Orz, I cannot find x!");continue;}
int tmp=p/G;while(x<0)x+=tmp;
printf("%lld\n",((x*z/G)%tmp+tmp)%tmp);
}
else{
mp.clear();
if(y%p==0&&z){puts("Orz, I cannot find x!");continue;}
int m=ceil(sqrt(p)),f=qpow(y,m,p),now=z%p;
for(int i=1;i<=m;++i)now=mul(now,y,p),mp[now]=i;
now=1;int flag=1;
for(int i=1;i<=m;++i){
now=mul(now,f,p);
if(mp[now]){
int ans=add(mul(i,m,p),-mp[now],p);
printf("%lld\n",add(ans,p,p));
flag=0;break;
}
}
if(flag)puts("Orz, I cannot find x!");
}
}
return 0;
}

\(\text{Hash}\)使用了\(\text{map}\).

时间复杂度\(O(\sqrt{\phi(p)})\),非扩展\(BSGS\)适用于\(p\)为质数情况。\(gcd(p,a)=1\).

浅谈BSGS的更多相关文章

  1. 浅谈BSGS(大步小步)及其扩展

    用途: 一般用来求\(a^x\equiv b\,\,(mod\,p)\)的最小正整数解,其中gcd(a,p)=1 设\(u=\lceil sqrt(p)\rceil\),则式子可以转化为\(a^{iu ...

  2. 浅谈BSGS和EXBSGS

    我的 BSGS 和各位犇犇的差不多,但是不需要求逆元 Luogu [ TJOI2007 ] 可爱的质数 原题展现 题目描述 给定一个质数 \(p\),以及一个整数 \(b\),一个整数 \(n\),现 ...

  3. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  4. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  5. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  6. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  7. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  8. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  9. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

随机推荐

  1. SSD-Tensorflow 512x512 训练配置

    搞了几天终于把这个给搞得差不多了,遇到的错误这里也记录一下: 一.配置[配置什么的300和512其实差不多,这里只举一个例子来分析一下] 之前的文件修改什么的和300x300的一样:https://w ...

  2. Visual Studio Installer闪退问题解决方法

    Visual Studio 2019安装推荐的方式是通过官方给的Installer进行的(2017也是同样方法),但是有时会出现在”即将完成…一切即将准备就绪“这个界面闪退的问题,导致软件的安装.卸载 ...

  3. Unity3D中可重载虚函数的总结

    重载虚函数:Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. A ...

  4. Educational Codeforces Round 68 (Rated for Div. 2)-C-From S To T

    You are given three strings ss, tt and pp consisting of lowercase Latin letters. You may perform any ...

  5. 跟我一起学.NetCore之中间件(Middleware)应用和自定义

    前言 Asp.NetCore中的请求管道是通过一系列的中间件组成的,使得请求会根据需求进行对应的过滤和加工处理.在平时开发中会时常引用别人定义好的中间件,只需简单进行app.Usexxx就能完成中间件 ...

  6. webservice的某些配置

    ajax调用的时候配置 <system.webServer> <validation validateIntegratedModeConfiguration="false& ...

  7. SQL Node 1.05版

    输出: select a.f1, b.f2 from table01 a, ( select a from tb ) b where a.f1=1 and b.f2=2 or b.f3=3 order ...

  8. 顶 最新简捷实用的JSP动态网站环境搭建详细步骤

    阿里西西小编给您推荐这个最新简捷实用的JSP动态网站环境搭建详细步骤讲解,这里还有关于JSP 动态网站 环境 搭建 的教程,希望您能够喜欢并学到东西提升自己的知识与技能,下面是内容详细阅读: 最新简捷 ...

  9. Web_php_unserialize 攻防世界

    1.$var输入处有一个正则过滤 2._wakeup处需要过滤 编写脚本如下 后在网页输入?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4Oi ...

  10. C语言知识点汇集

    int main() {// int num; int value; = int num,value; '''同时定义多个变量的方法 但是切记只能是同种类型的''' 都是int 或double等其他类 ...