【POJ2417】baby step giant step
最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下。
觉得总是忘记是因为没有彻底理解啊。

注意baby step giant step只能用在b和p互质的情况下,因为只有b和p互质的情况下,b才有mod p下的逆元。(下面要用到逆元)
当b和p不互质,就要处理一下。现在就正在做这么一题,方法以后再写。

求a^(-m)就用到了求逆元了,那么如何求逆元呢?我学了两种方法:
·1:欧拉定理:当a和n互质,a^φ ( n) ≡ 1(mod n)。【φ ( n) 是小于等于n的与n互质的数的个数】
·2:拓展欧几里德:设a在mod n下的逆元是x,则满足:ax ≡ 1(mod n)
即ax+ny=1。(a和n是常数,x和y是未知数,用拓展欧几里德求解即可)
注:只有当a和n互质,a才有mod n下的逆元。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
#define Maxn 1000010 struct node
{
int idx;
LL val;
}baby[Maxn]; bool cmp(node x,node y) {return x.val!=y.val ? x.val<y.val : x.idx<y.idx;} int binsearch(int cnt,LL tmp)
{
int head=,tail=cnt;
while(head<=tail)
{
int mid=(head+tail)>>;
if(baby[mid].val==tmp) return baby[mid].idx;
if(baby[mid].val<tmp) head=mid+;
else tail=mid-;
}
return -;
} LL powmod(LL a,LL b,LL mod)
{
LL ret=;
a%=mod;
while(b)
{
if(b&) ret=(ret*a)%mod;
a=(a*a)%mod;
b>>=;
}
return ret;
} int main()
{
LL p,b,n;
while(scanf("%lld%lld%lld",&p,&b,&n)!=EOF)
{
int m=(int)ceil(sqrt((double)(p-))),cnt=;
baby[].idx=,baby[].val=;
for(int i=;i<m;i++)
baby[i].idx=i,baby[i].val=(baby[i-].val*b)%p;
sort(baby,baby+m,cmp);
for(int i=;i<m;i++)
if(baby[i].val!=baby[cnt].val) baby[++cnt]=baby[i];
LL bm=powmod(powmod(b,p-,p),m,p);
//printf("bm = %lld\n",bm);
int ans=-;
LL tmp=n;
for(int i=;i<m;i++)
{
int pos=binsearch(cnt,tmp);
if(pos!=-)
{
ans=i*m+pos;
break;
}
tmp=(tmp*bm)%p;
}
if(ans==-) printf("no solution\n");
else printf("%d\n",ans);
}
return ;
}
poj2417
2016-02-03 09:50:33
【POJ2417】baby step giant step的更多相关文章
- 【学习笔记】Baby Step Giant Step算法及其扩展
1. 引入 Baby Step Giant Step算法(简称BSGS),用于求解形如\(a^x\equiv b\pmod p\)(\(a,b,p\in \mathbb{N}\))的同余方程,即著名的 ...
- 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法
先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝 扩展Baby Step Gian ...
- HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法
联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)
不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...
- 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)
什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...
- [置顶] hdu2815 扩展Baby step,Giant step入门
题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...
- 『高次同余方程 Baby Step Giant Step算法』
高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...
- HDU 2815 扩展baby step giant step 算法
题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/2 ...
- POJ 2417 Discrete Logging ( Baby step giant step )
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3696 Accepted: 1727 ...
随机推荐
- 苹果手机 iframe 无法滚动bug
原来在html5下,iframe 只有 src 属性scroling='no' 解决办法:在iframe外加一层第div,设置样式-webkit-overflow-scrolling:touch;ov ...
- IE浏览器div错乱问题
这个问题属于各浏览器的兼容问题,有时候在其他浏览器中,html页面布局都是正常显示,唯独IE浏览器的div块布局错乱了,可能是html文件上面的报头标准出现错误. 就是一段报头,告诉浏览器,你的文档以 ...
- c#中string.trimstart() 和string.trimend() 的用法
trim(),trimstart(),trimend()这样写是去掉空格,trimstart(a)是去掉字符串开始包含char[] a的字符,trimend同trimstart. 例:char[] a ...
- 读取Properties配置文件
一,Android中 在Android中读取配置文件,可以使用System.getProperties()方法读取: 1,在res资源目录下,新建一个文件夹 raw,然后在其下创建一个.propert ...
- ideadpad-安装win7
今天帮一个同学的朋友安装win7, 竟然安不上,很久没有出现安不上系统了, 后来发现他的笔记本是新的类型,预先注意事项为: 1,启动的时候,使用 Fn+F2进入 BIOS. 2,将Boot中的Boot ...
- SQL-Server索引漫谈
http://www.cnblogs.com/teroy/archive/2013/05/23/3070547.html
- 3DTouch
3DTouch 一.主屏按压(Home Screen Quik Actions) 1.静态标签 在info.plist文件中新增项 关键字 意义 UIApplicationShortcutItems ...
- CSS Positioning(定位)
Positioning(定位) CSS定位属性允许你为一个元素定位.它也可以将一个元素放在另一个元素后面,并指定一个元素的内容太大时,应该发生什么. 元素可以使用的顶部,底部,左侧和右侧属性定位.然而 ...
- Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法
之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果. 1.弹出 ...
- Google HTML/CSS/JS代码风格指南
JS版本参见:http://www.zhangxinxu.com/wordpress/2012/07/google-html-css-javascript-style-guides/ HTML/CSS ...