离散对数的求解(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 ...
随机推荐
- 如何关闭 window10 自带的杀毒软件
打开运行,快捷键[win+R],输入[ gpedit.msc],点击确定 在打开的组策略窗口中,依次展开计算机配置>管理模板>Windows组件,选择[windows组件]中的window ...
- SQL Sever删除外键
declare @sql varchar(max), @tab_name varchar(128), @fk_name varchar(128);declare c cursor forselect ...
- derby_学习_01_常用命令
一.常用命令 1.创建数据库 connect 'jdbc:derby://localhost:1527/jfcsdb;create=true'; 2.查看表 show tables; 二.参考资料 1 ...
- fastadmin学习文档
https://doc.fastadmin.net/docs/index.html 介绍 FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架. 主要特性 基于Auth ...
- 完成一个servlet 就要在web.xml里面配一个映射,这样就有一个路径供我们 使用????? servlet从页面接收值?
最后,最容易忘记的是:在dao层中 调用xml里的删除sql语句 后面需要人为加上事务提交.一定要! sqlSession.commit();//jdbc是自动提交,但是mybatis中不是自动提交的 ...
- jsp中向浏览器页面输出的方式总结
jsp中百分号内输出 不需要有JavaScript标签 1.因为jsp就是包含在html 里面,所以什么都不干时,就是在body里面输出html内容 2.百分号 内是JavaScript代码?java ...
- grep搜索子目录中包含某字符串的特定文件
grep -n "str" -r ./ 这是查找当前目录下以及下辖子目录下所有包含str字符串的文件,会列出文件名.以及该行的内容.以及行号 比如,我想搜源码目录src下,包含“n ...
- mysql-jdbc创建connection理解
jdbc源码分析(http://blog.csdn.net/brilliancezhou/article/details/5499738) 创建JDBC连接代码 Class.forName(" ...
- CodeForces - 961D:Pair Of Lines (几何,问两条直线是否可以覆盖所有点)
You are given n points on Cartesian plane. Every point is a lattice point (i. e. both of its coordin ...
- [SPOJ10707]Count on a tree II
luogu 题意 给定一个n个节点的树,每个节点表示一个整数,问u到v的路径上有多少个不同的整数. sol 也就是路径数颜色.树上莫队板子题. 我这种分块的姿势貌似是假的. 所以跑的是最慢的QAQ. ...