Luogu P3846 BSGS算法
https://www.luogu.com.cn/problem/P3846
BSGS这个东西是用来干啥的?
形如下面这个式子:
\]
其中: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算法:
我们考虑将这个区间分块:
\]
\]
\]
\]
然后我们进行下面的操作
①扫描第一行,若其中有答案,直接输出
②我们发现一个很显然的性质:第i行与第1行的同一列上的两个数,比值为:\(a^{(i-1)×\sqrt{p}}\)
若在第i行中,存在:
\]
则说明在第一行中,存在:
\]
而除(÷)操作,只需乘上它的逆元即可
根据费马小定理:
\]
\]
而\(a^{p-2}\)显然为a在模p意义下的逆元
因此:对于第i行,我们只需查询第一行。即可判断第i行是否存在答案。
这个东西直接用哈希即可在log的时间内实现
时间复杂度:
\]
代码如下:
#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算法的更多相关文章
- BSGS算法(大小步算法)
$BSGS$ 算法 $Baby\ Steps\ Giant\ Steps$. 致力于解决给定两个互质的数 $a,\ p$ 求一个最小的非负整数 $x$ 使得 $a^x\equiv b(mod\ p)$ ...
- BSGS算法解析
前置芝士: 1.快速幂(用于求一个数的幂次方) 2.STL里的map(快速查找) 详解 BSGS 算法适用于解决高次同余方程 \(a^x\equiv b (mod p)\) 由费马小定理可得 x &l ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
- [BSGS算法]纯水斐波那契数列
学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...
- BSGS算法
BSGS算法 我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客 Part1 BSGS算法 求解关于\(x\)的方程 \[y^x=z(mod\ p)\] 其中\((y,p)=1\) 做 ...
- BSGS算法及扩展
BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...
- uva11916 bsgs算法逆元模板,求逆元,组合计数
其实思维难度不是很大,但是各种处理很麻烦,公式推导到最后就是一个bsgs算法解方程 /* 要给M行N列的网格染色,其中有B个不用染色,其他每个格子涂一种颜色,同一列上下两个格子不能染相同的颜色 涂色方 ...
- BSGS算法及其扩展
bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...
随机推荐
- BUUOJ Misc刷题大作战
你竟然赶我走 随便一个txt文件都可以拿 LSB 当然还有别的,根据里面左右左右变化,在0管道有变化,然后把下面的三个0打钩,导出png,一个二维码,扫出来 乌镇峰会种图 只要会用winhex打开文件 ...
- Laravel - 上手实现 - 文件上传、保存到 public 目录下
1.为了访问方便,将上传的文件保存在 public 目录下,需要进行修改配置. 找到 config/filesystems.php 文件然后修改 root.具体如下: 'local' => [ ...
- 通过 Swoole\Table 实现 Swoole 多进程数据共享
第三方存储媒介 前面我们介绍了基于 Swoole 的 Process 及 Process\Pool 模块在 PHP 中实现多进程管理,但是多进程模式下进程间是相互隔离的,无法共享数据和变量,即便是通过 ...
- Async,Await 深入源码解析
1.同步与异步 假设存在 IO事件A:请求网络资源 (完成耗时5s) IO事件B:查询数据库 (完成耗时5s) 情况一:线程1工人在发起A请求后,一直阻塞等待,在A响应返回结果后再接着处理事件B,那总 ...
- HTTP 1.1, 返回值100.
HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401.客户端如果接受到100,才开始把请求body发送到服务器. 这样 ...
- mysql硬件优化
导致宕机的原因: 1. 运行环境: 35%,运行环境可以看做是支持数据库服务器运行的系统和资源集合,包括操作系统,硬盘以及网络 2. 性能:35% 3. 复制 20% 4 ...
- 日日算法:Dijkstra算法
介绍 Dijistra算法作为一种最短路径算法,可以用来计算一个节点到图上其他节点的最短距离. 主要是通过启发式的思想,由中心节点层层向外拓展,直到找到中点. 适用于无向图和有向图. 算法思想 假设我 ...
- 2018年要学习的10大Python Web框架
通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...
- Pig设计模式概要以及与SQL的设计模式的对比
2019独角兽企业重金招聘Python工程师标准>>> 1概要模式 概要模式其实就是数据的全貌信息的获取,主要分为3种: 1.1数值概要 #HSQL SELECT MIN(num), ...
- php安装igbinary扩展(windows)
pecl.php.net 是php的扩展仓库,访问此网站后,搜索需要安装的扩展,截图如下: igbinary: http://pecl.php.net/package/redis github的网址: ...