bsgs算法

主要用来解决${A^x} = B(\bmod C)$(c是质数),都是整数,已知A、B、C求x。

例:poj 2417 Discrete Logging

具体步骤如下:

先把$x = i*m - j$,其中$m = ceil(\sqrt C )$,(ceil是向上取整)。

这样原式就变为${A^{(i*m - j)}} = B(\bmod C)$,

再变为${A^j}*B = {A^{(m*i)}}(\bmod C)$。

枚举j(范围0-m),将${A^j}*B$存入hash表

枚举i(范围1-m),从hash表中寻找第一个满足${A^j} * B = {A^{(m * i)}}(\bmod C)$。

此时$x = i*m - j$即为所求。

在网上看到的其他题解大多用的是$x = i*m + j$,也可以做,只是会牵扯的求逆元,所以比较麻烦。使$x=i*m-j$就可以轻松避免这个问题了。

那么肯定有人会有疑问为何只计算到$m = ceil(\sqrt C )$就可以确定答案呢?

$x = i*m - j$ 也就是x 的最大值不会超过p,那超过p的怎么办 ?

有一个公式  ${a^{k\bmod (p - 1)}} = {a^k}(\bmod p)$    这个公式的推导需要用到费马小定理

$k\bmod p - 1$可以看做 $k - m*(p - 1)$ ,原式可化成  ${a^k}/{({a^{(p - 1)}})^m} = {a^k}(\bmod p)$

根据费马小定理 ${a^{(p - 1)}} = 1(\bmod p)$其中p为质数 ,a,p 互质,可得${a^k}/{1^m} = {a^k}(\bmod p){a^k} = {a^k}(\bmod p)$得证

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
ll q=,a=,yy,y2,m,ans,t;
map<ll,int>mp;
ll mod_pow(ll x,ll n,ll mod){
ll res=;
while(n>){
if(n&) res=res*x%mod;
x=x*x%mod;
n>>=;
}
return res;
} int main(){
while(~scanf("%lld%lld",&yy,&y2)){
mp.clear();
m=ceil(sqrt(q));
for(ll i=;i<=m;i++){
if(i==){
ans=yy%q;
mp[ans]=i;
continue;
}
ans=ans*a%q;
mp[ans]=i;
}
bool flag=false;
ans=;
t=mod_pow(a,m,q); for(int i=;i<=m;i++){
ans=ans*t%q;
if(mp[ans]){
ll temp=i*m-mp[ans];
ll rr=mod_pow(y2,temp,q);
printf("%lld\n",rr);
flag=true;
break;
}
}
if(!flag){
printf("No Solution\n");
}
}
return ;
}

离散对数的求解(bsgs)的更多相关文章

  1. 「算法笔记」BSGS 与 exBSGS

    一.离散对数 给定 \(a,b,m\),存在一个 \(x\),使得 \(\displaystyle a^x\equiv b\pmod m\) 则称 \(x\) 为 \(b\) 在模 \(m\) 意义下 ...

  2. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...

  3. Luogu4884 多少个1?(BSGS)

    11……1(n个)=99……9(n个)/9=(10n-1)/9. 那么显然就是求离散对数了,BSGS即可. #include<iostream> #include<cstdio> ...

  4. BSGS及其扩展

    目录 定义 原理 朴素算法 数论分块 例题 Luogu2485 [SDOI2011]计算器 题解 代码 扩展 例题 Luogu4195 [模板]exBSGS/Spoj3105 Mod 代码 之前写了一 ...

  5. 【解高次同余方程】51nod1038 X^A Mod P

    1038 X^A Mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P = B,其中P为质数.给出P和A B,求< P的所有X. 例如:P = 11 ...

  6. Discrete Log Algorithms :Baby-step giant-step

    离散对数的求解 1.暴力 2.Baby-step giant-step 3.Pollard’s ρ algorithm …… 下面搬运一下Baby-step giant-step 的做法 这是在 ht ...

  7. 一些数论概念与算法——从SGU261谈起

    话说好久没来博客上面写过东西了,之前集训过于辛苦了,但有很大的收获,我觉得有必要把它们拿出来总结分享.之前一直是个数论渣(小学初中没好好念过竞赛的缘故吧),经过一道题目对一些基础算法有了比较深刻的理解 ...

  8. Baby-step giant-step算法

    写在前面: 学习笔记,方便复习,学习资料来自网络,注明出处 我们都在努力奔跑,我们都是追梦人 结论 In group theory, a branch of mathematics, the baby ...

  9. BSGS求解离散对数问题

    离散对数问题是求解axΞb mod(n) 同余方程 以下模板使用于gcd(a,n)=1的情况 ; int hs[mod],head[mod],Next[mod],id[mod],top; void i ...

随机推荐

  1. Spring Boot配置文件详解:自定义属性、随机数、多环境配置

    自定义属性与加载 我们在使用Spring Boot的时候,通常也需要定义一些自己使用的属性,我们可以如下方式直接定义: application-dev.yml com.didispace.blog: ...

  2. hdu 1849 Rabbit and Grass(nim)

    Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. LINUX C的学习

    好吧看着LINUX那么多的命令好难受= =看到第三章有介绍C的编译的,先写下试试喽. 可以用gedit或者vim,老师虽然大肆吹捧vim的经典原谅用的真吉儿难受- -,一开始没安装vim用的gedit ...

  4. Gitlab上如何给指定人员在指定项目里设置指定权限,给项目设置保护

    一.在Gitlab页面里,点击Project,找到指定的Project里: 二.点击Members,可以添加人员,并给指定的人员设置权限 三.点击Protected Branches,可以给Proje ...

  5. 如何下载中文语言包让Eclipse汉化?

    Eclipse软件是JAVA开发必备的软件,对于英语不好的人而言面对英文代码还好,但是软件也是英语的那就头疼了,怎么解决?可以去官网下载中文语言包解压到Eclipse安装目录就可以汉化了.   工具/ ...

  6. BlockingQueue实现阻塞队列

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public cl ...

  7. uva11054 - Wine trading in Gergovia(等价转换,贪心法)

    这个题看上去麻烦,实际上只要想清楚就很简单.关键是要有一种等价转换的思维方式.其实题意就是个一排数,最后通过相邻的互相移动加减使得所有数都变成零,移动过程中每次都耗费相应值,让耗费的值最小.虽然从实际 ...

  8. HDU2065"红色病毒"问题【指数型母函数】

    Problem Description 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其 ...

  9. Apache POI实现excel导出

    链接:http://poi.apache.org/ Excel数据导出步骤: 使用poi 完成账户数据的导出功能 导入poi  jar包并添加到classpath中 1.查询数据 2.定义导出头 St ...

  10. [转] AS3地图拼接与战争迷雾的实现

    在开发游戏的过程中,特别是地图编辑器中,需要利用最少的资源,实现最丰富的地形地貌.虽然现在众多的RPG开始使用整图,但是我们偶尔还是需要能够让玩家自己编辑地图,或者其他需要自动进行地图构建的功能.另外 ...