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. 一道问题引出的python中可变数据类型与不可变数据类型

    一. 问题的提出 我们先来看两个对比 第一道题,当对象为整数时,最终结果:b = 2, a = 1,b的变化没有引起a的变化 a = 1 b = a b += 1 print(a) print(b) ...

  2. angularjs 简单指令

    <!DOCTYPE html> <html data-ng-app="app"> <head> <title>angular js& ...

  3. javascript queue 打字效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Spring mvc服务端消息推送(SSE技术)

    SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端.服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求 ...

  5. nyoj-211-Cow Contest(floyd算法)

    题目链接 /* Name:nyoj-211-Cow Contest Copyright: Author: Date: 2018/4/27 21:02:06 Description: floyd算法 大 ...

  6. python 字符串大小写相关函数

    改写:(都不会改变原字符串) s = 'hEllo wOrld' s Out[3]: 'hEllo wOrld' s.upper()#全部大写 Out[4]: 'HELLO WORLD' s Out[ ...

  7. java入门学习(1)一简介及其基础特点

    分类: java基础 1.为什么java如此流行,为什么历史选择了它? 因为它拥有全新的编程思想,更接近人们的语言习惯,由于其编译器把代码编译成字节码,然后再不同的平台上运行分别用不同的虚拟机去解释字 ...

  8. vector map迭代器失效解决方案

    vector : iter = container.erase(iter);    //erase的返回值是删除元素下一个元素的迭代器 vector<int>::iterator it = ...

  9. mysql中事务隔离级别可重复读说明

    mysql中InnoDB引擎默认为可重复读的(REPEATABLE READ).修改隔离级别的方法,你可以在my.inf文件的[mysqld]中配置: transaction-isolation = ...

  10. 数据库使用JDBC连接的方式

    下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用. 1.Oracle8/8i/9i/10g/11g数据库(thin模式) Class.forName("oracle.jdbc ...