【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 ...
随机推荐
- 2016 11 9遇到问题 http请求的各种方式
遇到问题:对接网易七鱼 调用他们接口是出现问题 1.对方要求 除上传文件外,其他所有接口请求Content-Type类型为:application/json;charset=utf-8:请求内容需要 ...
- iOS UIKit:animation
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- Java-struts2 配置hellow world
这里进行struts框架的配置问题,和简单的输出hellow world 配置的步骤 1. 配置TomCat 2. Jak 3. 拷贝struts.xml文件到src目录 ...
- Handler 原理分析和使用(一)
我为什么写Handler,原因主要还在于它在整个 Android 应用层面非常之关键,他是线程间相互通信的主要手段.最为常用的是其他线程通过Handler向主线程发送消息,更新主线程UI. 下面是一个 ...
- jsp - 引用 jar包.
在jsp中使用不同的方式引用jar,准备的工作也不同.我接触过的有两种:1)直接在jsp页面中引用;2)在src下的java类中引用,然后在jsp中调用java类. 1)直接引用:可以将jar包丢到W ...
- js跨浏览器事件对象、事件处理程序
项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节 ...
- oracle set命令
SQL>set colsep' '; //-域输出分隔符SQL>set echo off; //显示start启动的脚本中的每个sql命令,缺省为onSQL> set ...
- jQuery 遍历过滤
缩写搜索元素的范围 三个最基本的过滤方法是:first(), last() 和 eq(),它们允许您基于其在一组元素中的位置来选择一个特定的元素. 其他过滤方法,比如 filter() 和 not() ...
- Java stackoverflow error
本文想记录一下尝试产生stackoverflow的程序 1 -Xss=1k, 设置stack大小1024个字节,产生515个long,想把stack撑爆. 2 嵌套调用 3 创建大量线程 1 -Xss ...
- QT UI 如果发现布局之后,button不在父widget的中间
如果发现布局之后,button不在父widget的中间: 调整父widget的布局参数: