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\) 我们可以 ...
随机推荐
- Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId
一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...
- Springboot:整合Mybaits和Druid【监控】(十一)
MyBatis默认提供了一个数据库连接池PooledDataSource,在此我们使用阿里提供的Druid数据库连接池 项目下载:https://files.cnblogs.com/files/app ...
- 小白初学Java的一点点收获
作为刚刚学习Java没有几天的小白,我想把我在学习过程中,所学习到的知识和注意事项和大家一起分享分享.在这个过程中,希望大家可以有所收获,有什么不对的地方,希望大家指出并且私信我. 首先说说第一次记事 ...
- python工业互联网监控项目实战4—python opcua
前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的OPC UA.OPC作为早期的工业通信规范,是基于COM/DCOM的技术实现的,用于设备和软件之间交换数据,最初,OPC标准仅 ...
- 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- ElasticSearch的高级复杂查询:非聚合查询和聚合查询
一.非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程) 查询条件QueryBuilder的构建方法 1.1 精确查询(必须完全匹配上,相当于SQL语句中的“=”) ① 单个匹配 termQuery ...
- chcp437 转换英语,在西班牙语系统中无效
https://social.technet.microsoft.com/Forums/en-US/9c772011-5094-4df0-bf73-7140bf91673b/chcp-command- ...
- c++ 更新 performance counter 数据,错误码 87
ERROR_INVALID_PARAMETER 87 (0x57) The parameter is incorrect. 很可能是该送 ULONG 的送了 ULONGLONG,vise versa
- C++统一初始化语法(列表初始化)
引言 要是世上不曾存在C++14和C++17该有多好!constexpr是好东西,但是让编译器开发者痛不欲生:新标准库的确好用,但改语法细节未必是明智之举,尤其是3年一次的频繁改动.C++带了太多历史 ...
- Blazor WebAssembly 3.2.0 正式起飞,blazor 适合你吗?
最近blazor更新很快,今天在官方博客上发布了Blazor WebAssembly 3.2.0 RC:https://devblogs.microsoft.com/aspnet/blazor-web ...