#include <bits/stdc++.h>
#include <tr1/unordered_map>
using namespace std;
using std::tr1::unordered_map;
#define ll long long
const int maxn=1e6+7;
const int mod=998244353;
const int INF=0x3f3f3f3f;
/*
BSGS算法 b^l==n%p 求解最小的l
不妨直接把l拆分成i*m-j,这样的话同余方程就变为b^(i*m)==n*b^j%p
直接枚举j属于[0,m) m=ceil///向上取整(sqrt(p)) map记录当前的j的数值
随后枚举i属于[0,m)查询map是否存在j满足且需要满足i*m>j=op[s]
很显然这只是gcd(b,p)=1的情况,此时枚举只到了m-2与费马小定理对应
EXBSGS 由于gcd(p,b)不一定为1,所以我们可以求出gcd(p,b)根据裴蜀定理,有解的条件gcd(p,b)|n
所以就一直求出gcd(d2=(p/d),b),一直到他们之间互质,期间如果gcd(p/d,b)!|n就是无解
最后可以得到b^cnt/(d1*d2......*dcnt) *b^(l-cnt) == n/(d1*d2......*dcnt)mod(p/(d1*d2......*dcnt))
(d1*d2......*dcnt)=D
b^cnt/D * (b^(l-cnt))===n/Dmod(p/D)
b^cnt/D和n/d互质所以一定有解,所以将原来的S=1ll改为b^cnt/D直接用BSGS求(b^(l-cnt))
求得的x是l-cnt最后要加上cnt
*/
unordered_map<ll,ll>op;
ll p,b,n;
ll quick_pow(ll a,ll b,ll p)
{
ll ans=1;
while (b)
{
if (b&1)///b为奇数
ans=(ans*a)%p;
a=(a*a)%p;///b为偶数
b>>=1;
}
return ans;
}
ll BSGS(ll p,ll b,ll n,ll ans)
{
op.clear();
ll m=ceil(sqrt(p));
ll s=0;
for (ll i=0,s=n;i<m;++i,s=s*1ll*b%p)///枚举的时候map记录位置
{
op[s]=i;
}
for (ll i=0,tmp=quick_pow(b,m,p),s=ans;i<m;++i,s=s*1ll*tmp%p )///查找j
{
if (op.find(s)!=op.end())
{
if (i*m>=op[s])return 1ll*i*m-op[s];
}
}
return -1ll;
} ll GCD(ll a,ll b){return b?GCD(b,a%b):a;} ll EXBSGS(ll p,ll b,ll n)
{
b%=p;
n%=p;///先取模一下保证n,b<p
if (n==1||p==1)return 0;///n==1 l==0 p==1 n%1==0 l任意取值,但要最小所以为0
ll cnt=0;
ll d=0;
ll ans=1ll;
while (d!=1)
{
d=GCD(b,p);
if (n%d==1)return -1ll;///同余方程无解
++cnt;
p/=d;
n/=d;
ans=(ans*1ll*b/d)%p;
if (ans==n)return cnt;///特判情况 n*b^(l-cnt)==n/D mod(p/D) 此时的n*D==n%(p/d) 所以l==cnt
}
ll ret=BSGS(p,b,n,ans);
if (ret==-1ll)return -1ll;
else return ret+cnt;///求的是a^(x-cnt)
} int main()
{
while (EOF!=scanf("%lld%lld%lld",&b,&p,&n))///b^l==n%p
{
if (!b&&!p&&!n)return 0;
ll cnt=EXBSGS(p,b,n);
cnt==-1ll?cout<<"No Solution"<<endl:cout<<cnt<<endl;
}
return 0;
}

摘录自对该博客的理解

EXBSGS简叙的更多相关文章

  1. C#学习笔记(1) --简叙.net体系结构

    1 C#与.NET的关系 (1) C#是专门为与Microsoft的.Net Framework一起使用而设计的. (2) C#是一种基于面向对象设计方法的的语言. (3) 需要注意的是,C#就其本身 ...

  2. php反序列化简叙

    0x01 php简单的反序列化 这题是在网上看到的,原题连接不太了解,但是源码题目给了出来,稍微下文件名和排版在本地测试 <?php class SoFun{ protected $file=' ...

  3. STL 里面的几个容器简叙

    出处:http://blog.csdn.net/niushuai666/article/details/6654951 list1.list的成员函数push_back()把一个对象放到一个list的 ...

  4. AMD单双桥时序简叙

    芯片组(双桥)时序 VBAT :RTC电路的供电3V(RTC电路有问题会导致没复位或不跑码等故障) RTCCLK :晶振起振给南桥提供32.768KHz频率(RTC电路有问题会导致没复位或不跑码等故障 ...

  5. iOS面试题集锦

    一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷 ...

  6. 利用窗口引用漏洞和XSS漏洞实现浏览器劫持

    ==Ph4nt0m Security Team==                        Issue 0x03, Phile #0x05 of 0x07 |=----------------- ...

  7. Android SQLite总结[转载]

    [转载] :http://blog.163.com/zqy216_2008/blog/static/4119371820119954812509/ 最近在做的项目涉及到了SQLite,大学时没有好好学 ...

  8. iOS知识点集合--更改(2)

    3.nsmutablearray *a 如果直接赋值 a = @[@"d",@""]; 这个时候a 是不可变的 字典也是如此 2.如果接口调用错误的话 打印re ...

  9. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  10. HighCharts基本使用

    一.简叙 HighCharts是一个非常强大的画图插件,在以后的工作汇报,数字展示,它将是一把利器.既然是插件,那么就有它的使用规则,我们只需要遵循它的使用规则,就可以画出我们想要的展示效果了.期待吗 ...

随机推荐

  1. 用 Proxy 进一步提高 npm 安装速度

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  2. C++ 智能指针的删除器

    为什么要设置删除器 C++11 加入STL的 shared_ptr 和 unique_ptr,已经是我们编码的常客了.用的多自然就会了解到它们的删除器,比如很多C语言库(GDAL, GLFW, lib ...

  3. java LocalDateTime 加减当前时间

      LocalDateTime 可以对当前时间进行加减,在LocalDateTime类中,以plus打头的方法是增加某项时间,如plusDays的请求参数表示将要增加的天数,但是可以为负值:以minu ...

  4. 推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

    推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化 ...

  5. AI大模型应用开发入门-LangChain开发聊天机器人ChatBot

    在大模型应用开发中,状态管理 和 对话追踪 是不可忽视的重要能力,尤其在需要保存上下文.重放对话或进行异步处理时尤为关键. 今天我们来演示如何用 LangChain + OpenAI 的 GPT 模型 ...

  6. 一个开源免费、功能丰富的 WPF 自定义控件资源库

    前言 今天大姚给大家分享一个开源免费(MIT license).功能丰富的 WPF 自定义控件资源库:WPF-ControlBase. WPF 介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有 ...

  7. STM32深度学习实战

    STM32深度学习实战 1. 前言 ​ 本文主要记录基于 tensorflow 的简单模型在 stm32 上运行测试的调试记录,开发人员应对深度学习基础理论和 tensorflow 框架基础操作有一定 ...

  8. jemelloc论文(中英翻译)

    AScalable Concurrent malloc(3) Implementation for FreeBSD (基于FreeBSD的可伸缩的并发malloc(3)实现) 作者:Jason Eva ...

  9. FFmpeg开发笔记(六十七)Windows给FFmpeg集成支持RIST协议的librist

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"10.2  FFmpeg推流和拉流"提到直播行业存在RTSP和RTMP两种常见的流媒体协议.除此以外,还有比较两 ...

  10. 如何在FastAPI中玩转GitHub认证,让用户一键登录?

    title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: ...