bsgs算法详解
例题 poj 2417bsgs http://poj.org/problem?id=2417
这是一道bsgs题目,用bsgs算法,又称大小步(baby step giant step)算法,或者拔(b)山(s)盖(g)世(s)算法,或者北(b)上(s)广(g)深(s)算法。。。
题目大意就是
给定a,b,p,求最小的非负整数x,满足 ax ≡ b(mod p)
先令 x = i*m-j,其中 m=ceil(sqrt(p)),ceil是向上取整。
这样原式就变为 ai*m-j = b (mod p),
移项就变成了 ai*m = b*aj (mod p)
枚举j (范围0-m) ,将 b*aj 存入hash表。
枚举i (范围1-m) ,从hash表中寻找第一个满足ai*m = b*aj (mod p)。
此时 x = i*m-j 就是所要求的。
那么为什么只计算到 m=ceil(sqrt(q)) 就可以确定答案呢?
因为 x = i*m-j , 所以x 的最大值不会超过p
a(k mod p-1) = ak (mod p) 证明这个公式,(需要用到费马小定理)
k mod p-1 就是 k-m(p-1) ,原式就变成了 ak-m(p-1) ≡ ak (mod p)
再变一步 ak / am(p-1) ≡ ak (mod p)
这时让 am(p-1) ≡ 1 (mod p) 就行了。
由费马小定理知: 当p为质数且 (a,p) = 1 时 ap-1 ≡ 1 (mod p)
所以推出 p 为质数 且 (a,p)=1 这个条件, 所以 a(k mod p-1) ≡ a k (mod p)
所以:如果枚举 x 的话枚举到 p 即可。
所以使 im−j<=p , 即 m=⌈√p⌉ , i,j 最大值也为m。
这是代码,结合上面的看
#include<cstdio>
#include<algorithm>
#include<map>
#include<cmath> using namespace std;
typedef long long ll; map<ll,int>mp;
ll p,a,b;
ll n,m,now,ans,t;
bool flag; ll fast_pow(ll x)
{
ll sum = ;
ll aa = a;
while (x>)
{
if (x&)
sum = (sum*aa)%p;
x = x>>;
aa = (aa*aa)%p;
}
return sum;
}
int main()
{
while(scanf("%lld%lld%lld",&p,&a,&b)!=EOF)
{
if(a%p==)
{
printf("no solution\n");
continue;
}
mp.clear();
m = ceil(sqrt(p));
flag = false ;
now = b%p; //b*a^j 当j==0时
mp[now] = ;
for(int i=;i<=m;++i)
{
now = (now*a)%p;
mp[now] = i;
}
t = fast_pow(m);
now = ;
for(int i=;i<=m;++i) //枚举 (a^m)^i
{
now = (now*t)%p;
if(mp[now])
{
flag = true;
ans = i*m-mp[now];
printf("%lld\n",(ans%p+p)%p); //printf("%lld\n",(ans%p+p)%p);
break;
}
}
if(!flag) printf("no solution\n");
}
return ;
}
bsgs
bsgs算法详解的更多相关文章
- BSGS(Baby Steps,Giant Steps)算法详解
BSGS(Baby Steps,Giant Steps)算法详解 简介: 此算法用于求解 Ax≡B(mod C): 由费马小定理可知: x可以在O(C)的时间内求解: 在x=c之后又会循环: 而BS ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
- KMP算法详解(转自中学生OI写的。。ORZ!)
KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...
- EM算法详解
EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...
- Tarjan算法详解
Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...
随机推荐
- Python的生成器进阶玩法
Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...
- Export SQLite data to Excel in iOS programmatically(OC)
//For the app I have that did this, the SQLite data was fairly large. Therefore, I used a background ...
- oracle用户密码过期!the password has expired
Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月 ...
- HDU 2086 A=? 数学题
题目描述:有一个公式,Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).,如果给出A0, An+1, 和 C1, C2, .....Cn要你计算出A1是多 ...
- 如何使用optipng压缩png图片
OptiPNG – Google推荐的png图片无损压缩工具下载及使用教程 2014年08月24日 实用软件 暂无评论 optipng png图片无损压缩工具介绍: optipng png图片无损压缩 ...
- Twisted框架
Twisted是一个事件驱动型的网络模型.时间驱动模型编程是一种范式,这里程序的执行流由外部决定.特点是:包含一个事件循环,当外部事件发生时,使用回调机制来触发相应的处理. 线程模式: 1.单线程同步 ...
- 基于FPGA(DDS)的正弦波发生器
记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出.我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差:后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不 ...
- 在 Linux 上找出并解决程序错误的主要方法【转】
转自:https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html 本文讨论了四种调试 Linux 程序的情况.在第 1 种情况 ...
- linux设备驱动归纳总结(三):3面向对象思想和lseek、container_of、write、read 【转】
linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 转自:http://blog.chinaunix.net/uid-25014876-id-59418.html 一.结构体 ...
- oracle数据库查询重复记录
1.row_number()方法 1 2 3 4 5 6 7 8 9 10 11 SELECT row_number () over ( PARTITION BY v.acti ...