https://www.luogu.com.cn/problem/P3846

BSGS这个东西是用来干啥的?

形如下面这个式子:

\[a^b = c\;(mod\;p)
\]

其中:p是一个质数。\(2\leq a,b<p\leq2^{31}-1\)

求一个最小的正整数b,使得式子成立

首先,我们要知道一个东西。这个式子是有循环节的

根据费马小定理:p是质数,且a不是p的倍数时

有:\(a^{p-1}\equiv1\;(mod\;p)\)

而:\(a^0=1\)

因此答案是落在\([0,p-2]\)这个区间内的:


暴力:枚举b

时间复杂度:\(O(p) \;\;\;=>TLE\)


BSGS算法:

我们考虑将这个区间分块:

\[a^0,a^1,a^2,\cdots,a^{\sqrt{p}-1}
\]

\[a^{\sqrt{p}},a^{\sqrt{p}+1},\cdots,a^{2\sqrt{p}-1}
\]

\[\cdots
\]

\[a^{^{(\sqrt{p}-1)×\sqrt{p}}},\cdots,a^{p-1}
\]

然后我们进行下面的操作

①扫描第一行,若其中有答案,直接输出

②我们发现一个很显然的性质:第i行与第1行的同一列上的两个数,比值为:\(a^{(i-1)×\sqrt{p}}\)

若在第i行中,存在:

\[a^k=c\;(mod\;p)
\]

则说明在第一行中,存在:

\[a^r=\frac{c}{a^{(i-1)×\sqrt{p}}}
\]

而除(÷)操作,只需乘上它的逆元即可

根据费马小定理:

\[∵a^{p-1}\equiv1(mod\;p)
\]

\[∴a^{p-2}×a\equiv1(mod\;p)
\]

而\(a^{p-2}\)显然为a在模p意义下的逆元

因此:对于第i行,我们只需查询第一行。即可判断第i行是否存在答案。

这个东西直接用哈希即可在log的时间内实现

时间复杂度:

\[O(\sqrt{p}×log\;p)\;\;=> AC
\]

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std; #define int long long
int a,d,p,s[233333],sq;
map<int,int> mp;
int ksm(int a,int b,int mod)//快速幂
{
int ans=1;
while(b)
{
if(b&1)ans=1LL*ans*a%mod;
a=1LL*a*a%mod;
b>>=1;
}
return ans;
}
int BSGS()
{
sq=ceil(sqrt(p));
s[0]=1;mp[1]=0;
for(int i=1;i<=sq;i++)
{
s[i]=1LL*s[i-1]*a%p;
mp[s[i]]=i;
//用哈希表记录
if(s[i]==d)return i;
//若在第一行发现答案,直接输出
}
int dif=ksm(a,sq,p);
for(int l=sq+1,r=sq+sq,i=2;l<p;l+=sq,r+=sq,i++)
{
int inv=ksm(dif,i-1,p);
inv=ksm(inv,p-2,p);//求逆元
int t=1LL*d*inv%p;
if(mp.count(t))return mp[t]+(i-1)*sq;
//如果在第1行中查询存在,则说明第i行有答案
}
return -1;//说明无解
}
signed main()
{
scanf("%lld%lld%lld",&p,&a,&d);
if(d>=p||a>=p)//特殊情况
{
puts("no solution");
return 0;
}
int res=BSGS();
if(res==-1)puts("no solution");
else printf("%lld\n",res);
return 0;
}

Luogu P3846 BSGS算法的更多相关文章

  1. BSGS算法(大小步算法)

    $BSGS$ 算法 $Baby\ Steps\ Giant\ Steps$. 致力于解决给定两个互质的数 $a,\ p$ 求一个最小的非负整数 $x$ 使得 $a^x\equiv b(mod\ p)$ ...

  2. BSGS算法解析

    前置芝士: 1.快速幂(用于求一个数的幂次方) 2.STL里的map(快速查找) 详解 BSGS 算法适用于解决高次同余方程 \(a^x\equiv b (mod p)\) 由费马小定理可得 x &l ...

  3. 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法

    BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...

  4. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

  5. [BSGS算法]纯水斐波那契数列

    学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...

  6. BSGS算法

    BSGS算法 我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客 Part1 BSGS算法 求解关于\(x\)的方程 \[y^x=z(mod\ p)\] 其中\((y,p)=1\) 做 ...

  7. BSGS算法及扩展

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

  8. uva11916 bsgs算法逆元模板,求逆元,组合计数

    其实思维难度不是很大,但是各种处理很麻烦,公式推导到最后就是一个bsgs算法解方程 /* 要给M行N列的网格染色,其中有B个不用染色,其他每个格子涂一种颜色,同一列上下两个格子不能染相同的颜色 涂色方 ...

  9. BSGS算法及其扩展

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

随机推荐

  1. asp.net core webapi 配置跨域处理

    在Startup.cs文件中的ConfigureServices方法中加入如下代码: //配置跨域处理 services.AddCors(options => { options.AddPoli ...

  2. 测评软件Lemon教程

    Lemon 信息技术测评软件 目录 下载与安装 编译器配置 添加样例和选手 完成测评 1.下载与安装 万恶的 伟大的百度网盘: 链接: https://pan.baidu.com/s/1BfMhs_z ...

  3. [PHP] 获取IP 和JS获取IP和地址

    通过js获取 服务器 ip 服务器端口 服务器地址 var address=window.location.href; thisDLoc = document.location; var hostpo ...

  4. ES[7.6.x]学习笔记(三)新建索引

    与ES的交互方式 与es的交互方式采用http的请求方式,请求的格式如下: curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT& ...

  5. 每天都在用,但你知道 Tomcat 的线程池有多努力吗?

    这是why的第 45 篇原创文章.说点不一样的线程池执行策略和线程拒绝策略,探讨怎么让线程池先用完最大线程池再把任务放到队列中. 荒腔走板 大家好,我是 why,一个四川程序猿,成都好男人. 先是本号 ...

  6. Java 创建 Excel 数据透视表

    Excel 数据透视表具有强大的数据处理功能,能够使表格中的数据更加直观化.使用Excel 数据透视表,能方便用户快速的排序. 筛选各种数据,同时也能满足用户对不同数据汇总的需求.本文将介绍如何在Ja ...

  7. ES6让字符串String增加了哪些好玩的特性呢?

    确实因为现在天气变热了,所以一天天的这么写我也很累.所以如果阅读的时候有什么错误还请大家指出来,不好意思.学习永无止境. OK,今天继续讲解ES6系列知识 学过上一节的解构赋值就知道,ES6确实给我们 ...

  8. <algorithm>中sort()函数的用法

    先说一下,本篇文章我没有讲sort()实现排序的原理,我写在另一篇文章中了,如果想了解的话,可以看一下,附上链接:https://www.cnblogs.com/buanxu/p/12772700.h ...

  9. Fedora 21下lingo14配置

    Install lingo14 during Fedora 21 The first step:Download lingo14Download address:http://www.lindo.co ...

  10. Eclipse Mac OS 安装 最新版 Subversion插件subclipse

    subclipse 目前全部转移到github 官方地址 https://github.com/subclipse/subclipse/wiki Eclipse mac版 安装 最新版svn插件sub ...