求解A^x ≡ B mod P (P不一定是质数)的最小非负正整数解

先放几个同余定理:

一、判断如果B==1,那么x=0,算法结束

二、若gcd(A,P)不能整除 B,则 无解,算法结束

三、若gcd(A,P)!=1,令d=gcd(A,P),若d不能整除B,则无解,算法结束。

四、持续步骤三,直至 gcd(A,)=1

有 

五、枚举 0<x<k,若有解,输出x,算法结束

六、对于x>=k,

A=,B=,P=

A,P 互素 ,

直接用BSGS 求    * A ^ x ≡ B mod P

所得结果再+k即可

#include<map>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; typedef long long LL; map<int,int>mp; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int get_gcd(int a,int b) { return !b ? a : get_gcd(b,a%b); } int Pow(int a,int b,int mod)
{
int res=;
for(;b;a=1LL*a*a%mod,b>>=)
if(b&) res=1LL*res*a%mod;
return res;
} int ex_BSGS(int A,int B,int C)
{
if(B==) return ;
int k=,tmp=,d;
while()
{
d=get_gcd(A,C);
if(d==) break;
if(B%d) return -;
B/=d; C/=d;
tmp=1LL*tmp*(A/d)%C;
k++;
if(tmp==B) return k;
}
mp.clear();
int mul=B;
mp[B]=;
int m=ceil(sqrt(1.0*C));
for(int j=;j<=m;++j)
{
mul=1LL*mul*A%C;
mp[mul]=j;
}
int am=Pow(A,m,C);
mul=tmp;
for(int j=;j<=m;++j)
{
mul=1LL*mul*am%C;
if(mp.count(mul)) return j*m-mp[mul]+k;
}
return -;
} int main()
{
int A,C,B;
int ans;
while()
{
read(A); read(B); read(C);
if(!A) return ;
ans=ex_BSGS(A,B,C);
if(ans==-) puts("No Solution");
else cout<<ans<<'\n';
}
}

扩展BSGS算法的更多相关文章

  1. BSGS及扩展BSGS算法及例题

    \(BSGS(baby-step-giant-step)\)算法是用来解高次同余方程的最小非负整数解的算法,即形如这个的方程: \(a^x\equiv b(mod\ p)\) 其中\(p\)为质数(其 ...

  2. BSGS算法学习笔记

    从这里开始 离散对数和BSGS算法 扩展BSGS算法 离散对数和BSGS算法 设$x$是最小的非负整数使得$a^{x}\equiv b\ \ \ \pmod{m}$,则$x$是$b$以$a$为底的离散 ...

  3. BSGS算法及扩展

    BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...

  4. BSGS算法及其扩展

    bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...

  5. BSGS算法_Baby steps giant steps算法(无扩展)详解

    Baby Steps-Varsity Giant Step-Astronauts(May'n・椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反 ...

  6. 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器

    说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...

  7. BSGS与扩展BSGS

    BSGS \(BSGS\)算法又称大步小步\((Baby-Step-Giant-Step)\)算法 \(BSGS\)算法主要用于解以下同余方程 \[A^x\equiv B(mod\ p)\]其中\(( ...

  8. BSGS算法总结

    BSGS算法总结 \(BSGS\)算法(Baby Step Giant Step),即大步小步算法,用于解决这样一个问题: 求\(y^x\equiv z\ (mod\ p)\)的最小正整数解. 前提条 ...

  9. BSGS和扩展BSGS

    BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...

随机推荐

  1. C++ 输入输出八进制、十进制、十六进制

    默认进制 cin or cout在默认情况下按照十进制输入输出 八进制 要使输入为八进制数,首先切换至八进制输入 cin >> oct; //接下里就可以输入八进制数了 cin >& ...

  2. 简易selenium自动化测试框架(Python)

    最近空闲时间在探索Selenium的自动化测试,简单的写了一个小框架来测试公司的一个web产品.该框架包括以下模块: 1. Test case编写模式(page模式,参考之前的博文http://www ...

  3. intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示

    如上图: 环境 是 刚换的系统,重装的Intellj,直接双击老的皇帝项目中的idea的 .iml文件,结果 打开 intellj 后,进行 ctrl +shift +F9 编译时 尽然报 错误提示, ...

  4. linux系统--用户和用户组

    一.用户和用户组的概念 用户:使用操作系统的人 用户组:具有相同系统权限的一组用户.在linux系统中可以存在多个用户组 1.1 /etc/group 这里存储当前系统中所有用户组的信息 每一行对应一 ...

  5. sql server存储过程简单的使用

    --创建存储过程 create proc test_proc @date datetime as select * from t_user where times between ),),),),' ...

  6. Postfix 邮件服务 - DNS服务

    DNS 服务 (系统需要配置静态 IP 地址) yum install bing* -y 一.配置 NDS 域名解析: 直接添加以下内容: [root@mail ~]# cat /etc/named. ...

  7. Linux - 网络检测

    linux 利用bmon/nload/iftop/vnstat/iptraf实时查看网络带宽状况 .添加yum源方便安装bmon # rpm -Uhv http://apt.sw.be/redhat/ ...

  8. mysql 8.0 ~ 安装

    1 环境配置   wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.13-linux-glibc2.12-x86_64.tar. ...

  9. Java并发编程(1)-Java内存模型

    本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...

  10. MySQL内连接、外连接、交叉连接

    外连接: 左连接:left join 或 left outer join 以左边的表为基准,如果左表有数据,而右表没有数据,左表的数据正常显示,右表数据显示为空. 创建user表,用于记录用户 use ...