例题  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)

再变一步  a/ 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 (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算法详解的更多相关文章

  1. BSGS(Baby Steps,Giant Steps)算法详解

    BSGS(Baby Steps,Giant Steps)算法详解 简介: 此算法用于求解 Ax≡B(mod C): 由费马小定理可知: x可以在O(C)的时间内求解:  在x=c之后又会循环: 而BS ...

  2. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  3. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  4. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  5. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  6. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  7. KMP算法详解(转自中学生OI写的。。ORZ!)

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

  8. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...

  9. Tarjan算法详解

    Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...

随机推荐

  1. Hadoop基础-MapReduce的Combiner用法案例

    Hadoop基础-MapReduce的Combiner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编写年度最高气温统计 如上图说所示:有一个temp的文件,里面存放 ...

  2. 2018年11月25日ICPC焦作站参赛总结

    可能就这么退役了吧. 对这次ICPC还是比较有信心的,毕竟心态都放平和了. 路途很波折,热身赛还是赶上了. 等到了正赛的时候,开场看出了A题的签到,签到肯定是我来签的,11分钟签完了这道题之后,开始看 ...

  3. asp.net将ppt文档转换成pdf

    一.添加引用 using Microsoft.Office.Core;using Microsoft.Office.Interop.PowerPoint; 二.转换方法   C# 代码   复制 // ...

  4. 就for循环VS for-in循环

    这种模式的问题在于每次循环迭代的时候都要访问数据的长度.这样会使代码变慢,特别是当myarray不是数据,而是HTML容器对象时. HTML容器是DOM方法返回的对象,如: document.getE ...

  5. 20155212 2016-2017-2 《Java程序设计》第6周学习总结

    20155212 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Chapter10 输入串流为java.io.InputStream,输出串流为java.i ...

  6. Python 入门基础1 --语言介绍

    本节目录: 一.编程语言介绍 二.python解释器介绍 三.安装python解释器 四.运行python程序的两种方式 五.变量 六.后期补充内容 一.编程语言介绍 1.机器语言: 直接用二进制编程 ...

  7. LOJ 2249: 洛谷 P2305: 「NOI2014」购票

    题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...

  8. OS X 10.11:如何完全停用Time Machine。

    家里的2010年21.5英寸iMac越来越慢,用HFS+分区的1.5TB外置硬盘进行备份时,100G数据经常两三个小时还不能备份完.Time Machine虽然方便,但效率太低,不得不停用. 1. 要 ...

  9. asp.net 文件下载显示中文名称

    protected void Page_Load(object sender, EventArgs e)    {        string guid = Request.QueryString[& ...

  10. [原创]Sql2008 使用TVP批量插入数据

    TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...