离散对数的求解(bsgs)
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)的更多相关文章
- 「算法笔记」BSGS 与 exBSGS
一.离散对数 给定 \(a,b,m\),存在一个 \(x\),使得 \(\displaystyle a^x\equiv b\pmod m\) 则称 \(x\) 为 \(b\) 在模 \(m\) 意义下 ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- Luogu4884 多少个1?(BSGS)
11……1(n个)=99……9(n个)/9=(10n-1)/9. 那么显然就是求离散对数了,BSGS即可. #include<iostream> #include<cstdio> ...
- BSGS及其扩展
目录 定义 原理 朴素算法 数论分块 例题 Luogu2485 [SDOI2011]计算器 题解 代码 扩展 例题 Luogu4195 [模板]exBSGS/Spoj3105 Mod 代码 之前写了一 ...
- 【解高次同余方程】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 ...
- Discrete Log Algorithms :Baby-step giant-step
离散对数的求解 1.暴力 2.Baby-step giant-step 3.Pollard’s ρ algorithm …… 下面搬运一下Baby-step giant-step 的做法 这是在 ht ...
- 一些数论概念与算法——从SGU261谈起
话说好久没来博客上面写过东西了,之前集训过于辛苦了,但有很大的收获,我觉得有必要把它们拿出来总结分享.之前一直是个数论渣(小学初中没好好念过竞赛的缘故吧),经过一道题目对一些基础算法有了比较深刻的理解 ...
- Baby-step giant-step算法
写在前面: 学习笔记,方便复习,学习资料来自网络,注明出处 我们都在努力奔跑,我们都是追梦人 结论 In group theory, a branch of mathematics, the baby ...
- BSGS求解离散对数问题
离散对数问题是求解axΞb mod(n) 同余方程 以下模板使用于gcd(a,n)=1的情况 ; int hs[mod],head[mod],Next[mod],id[mod],top; void i ...
随机推荐
- 五一培训 清北学堂 DAY3
今天是钟皓曦老师的讲授~ 今天的内容:动态规划 1.动态规划 动态规划很难总结出一套规律 例子:斐波那契数列 0,1,1,2,3,5,8,…… F[0]=0 F[1]=1 F[[n]=f[n-1]+ ...
- 在struts2.5版本中使用DMI遇到问题
struts2.5 为了提升安全性,添加了 allomethod 这么个玩意. 解决方法是在配置文件中添加: <package name="exam" extends=&qu ...
- OOP思想应该怎样来理解?
https://blog.csdn.net/qq157962718/article/details/50990154 https://www.cnblogs.com/xiaosongluffy/p/5 ...
- nyoj-115-城市平乱(dijkstra算法)
题目链接 /* Name:nyoj-115-城市平乱 Copyright: Author: Date: 2018/4/25 17:28:06 Description: dijkstra模板题 枚举从 ...
- AutoCAD2014的安装与激活
1.安装包与激活文件的下载 链接:https://pan.baidu.com/s/1I2-x9T__sQAgtvjkOyc_1Q 密码:5pd1 2.CAD的安装 此过程没什么特殊要求,安装时随便输入 ...
- 2017-2018-1 20179215 第十一周 ShellShock攻击实验
<Linux内核原理与设计>第十一周作业 ShellShock攻击实验 分组:和20179205王雅哲共同完成实验及博客攥写 实验内容: Bash中发现了一个严重漏洞shellshock ...
- 【1】String,StringBuffer,StringBuillder的底层结构研究
一:StringBuffer的底层 (1)线程安全的字符串操作类 (2)通过synchronized关键字声明同步方法,保证多线程环境下数据安全 @Override public synchroniz ...
- UGUI transform
在编辑器中将UGUI对象挂在另一个物体上,UGUI预制体根对象位置调成零,调好位置后保存 由gameframework初始化,再挂到对应父对象上时,位置会有偏差,会更改锚点旋转等信息,需在OnWind ...
- [转]html5 video在安卓大部分浏览器包括微信最顶层的问题
能否解决video标签置顶的问题?答案是:不行的. 具体可查看官方解释:http://x5.tencent.com/guide?id=2009 //====================201604 ...
- spark流程跟踪
每个action对应一个job,每个job里面会有很多个阶段(stage),其实每个stage都是一个算子(Operation),可能是transformation,可能是action:但是actio ...