浅谈BSGS
用于求解形如\(a^x≡b\mod p\)的最小非负整数解\(x\).
由欧拉定理\(a^{\phi(p)}≡1\mod p\)可以知道,我们找的解如果有解则一定在\(\phi(p)\)范围内,而最大的范围就是当\(p\)为质数时,等于\(p-1\).
一种暴力方法是枚举指数验证。由于\(gcd(a,p)=1\).则\(a\)在\(\mod p\)意义下必有逆元。所以,我们考虑分解一下质数的表示形式。
知道最大范围不超过\(p\),所以我们令\(x=i*m-j\),将\(a^{-j}\)移项到左边,变成\(a^{i*m}≡b*a^j\mod p\).这里\(m=\lceil{\sqrt{p}}\rceil\).
我们枚举\(b*a^j\),把它们\(\mod p\)的值插入到\(\text{Hash}\)表里面。我们再枚举\(a^{i*m}\),如果这个值在\(\text{Hash}\)表里面出现过,则跳出循环,输出答案。
特判无解,一是没有找到解,另一个是无解,即\(a\mod p=0,b!=0\),或是\(a=0\)的时候。(就那几个特殊情况)
这就是\(BSGS\)的基本思路。下面是\(\text{fast_power,Exgcd,BSGS}\)的三合一模板。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
int mul(int a,int b,int p){return (1ll*a*b)%p;}
int add(int a,int b,int p){return (1ll*a+b)%p;}
int qpow(int a,int b,int p){
int res=1;
while(b){
if(b&1)res=mul(res,a,p);
a=mul(a,a,p);b>>=1;
}
return res;
}
int Exgcd(int a,int b,int &x,int &y){
if(!b){x=1,y=0;return a;}
int res=Exgcd(b,a%b,x,y);
int tmp=x;x=y;y=tmp-a/b*y;
return res;
}
map<ll,ll>mp;
int T,opt;
signed main(){
scanf("%lld%lld",&T,&opt);
for(;T;--T){
int y,z,p;
scanf("%lld%lld%lld",&y,&z,&p);
if(opt==1)printf("%lld\n",qpow(y,z,p));
else if(opt==2){
int x,yy;
int G=Exgcd(y,p,x,yy);
if(z%G){puts("Orz, I cannot find x!");continue;}
int tmp=p/G;while(x<0)x+=tmp;
printf("%lld\n",((x*z/G)%tmp+tmp)%tmp);
}
else{
mp.clear();
if(y%p==0&&z){puts("Orz, I cannot find x!");continue;}
int m=ceil(sqrt(p)),f=qpow(y,m,p),now=z%p;
for(int i=1;i<=m;++i)now=mul(now,y,p),mp[now]=i;
now=1;int flag=1;
for(int i=1;i<=m;++i){
now=mul(now,f,p);
if(mp[now]){
int ans=add(mul(i,m,p),-mp[now],p);
printf("%lld\n",add(ans,p,p));
flag=0;break;
}
}
if(flag)puts("Orz, I cannot find x!");
}
}
return 0;
}
\(\text{Hash}\)使用了\(\text{map}\).
时间复杂度\(O(\sqrt{\phi(p)})\),非扩展\(BSGS\)适用于\(p\)为质数情况。\(gcd(p,a)=1\).
浅谈BSGS的更多相关文章
- 浅谈BSGS(大步小步)及其扩展
用途: 一般用来求\(a^x\equiv b\,\,(mod\,p)\)的最小正整数解,其中gcd(a,p)=1 设\(u=\lceil sqrt(p)\rceil\),则式子可以转化为\(a^{iu ...
- 浅谈BSGS和EXBSGS
我的 BSGS 和各位犇犇的差不多,但是不需要求逆元 Luogu [ TJOI2007 ] 可爱的质数 原题展现 题目描述 给定一个质数 \(p\),以及一个整数 \(b\),一个整数 \(n\),现 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
随机推荐
- JS开发必须知道的41个技巧
JS是前端的核心,但有些使用技巧你还不一定知道:本文梳理了JS的41个技巧,帮助大家提高JS的使用技巧: Array 1.数组交集 普通数组 const arr1 = [, , , , , ,],ar ...
- bzoj1590 Secret Message
Description 贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息. 信息是二进制的,共有M(1≤M≤50000)条.反间谍能力很强的约翰已经部分拦截了这些信息,知道了第i条二进制信息的 ...
- lidar激光雷达领域的分类
lidar领域可以按分为以下五方面: 激光雷达系统与装备 激光雷达系统与开发 激光雷达光源 激光雷达探测 多光谱激光雷达系统 单光子激光雷达系统 低成本RGB-D距离传感器 激光雷达元器件及装备等 激 ...
- Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
不管你是否意识到,在这几年时间里,技术岗招聘重点关注的是Docker.Kubernetes(以下简称: K8S),面试10家公司得有8家会问你会不会"docker"."k ...
- Composer 包版本的范围指定(版本约束)
1. 包版本范围指定(自动下载版本约束范围中的最新版) 名称 实例 说明 不指定版本 根据当前Path环境变量中的php版本下载最合适的最新版 确切的版本 6.0.1 指定下载的具体版本号 范围 &g ...
- Hexo + Github Pages搭建个人网站主页
1.GitHub创建个人仓库 登录GitHub创建账号,同时拥有一个自己设定的用户名(username).点击New Repositories创建仓库.仓库名必须为username.github.io ...
- git 快速入门及常用命令
身为技术人员,都知道Git是干嘛的.从服务端角度它是代码仓库,可以多人协作.版本控制.高效处理大型或小型项目所有内容:从客户端讲,它能够方便管理本地分支.且与服务端代码的同步,从拉取.合并.提交等等管 ...
- 秒懂JVM的三大参数类型,就靠这十个小实验了
秒懂JVM的三大参数类型,就靠这十个小实验了 你好,我是悟空哥,「7年项目开发经验,全栈工程师,开发组长,超喜欢图解编程底层原理」.手写了2个小程序,Java刷题小程序,PMP刷题小程序,已发布到公众 ...
- [LeetCode]64. 最小路径和(DP)
题目 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4 ...
- 如何在项目中使用composer的相关功能
最近要在公司的magento项目中引用第三方库,用了composer来进行管理,composer还是非常方便的: 1.在应用的根目录下添加文件:composer.json { "nam ...