【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 ...
随机推荐
- LabVIEW系列——错误簇的传递
从以下示例可以得出结论: 1.图一出现的三种错误,分别位于打开/创建/替换文件函数,写入文本文件函数,读取文件文件函数.说明三个函数都被运行了. 2.图二只出现了一种错误,位于打开/创建/替换文件函数 ...
- magic_quotes_runtime(魔术引号开关)
我们可以通过以下代码来探测php环境中magic_quotes_runtime是否开启: magic_runtime.php 源代码如下: <?php //当magic_quotes_runti ...
- angularjs 更新局部作用域
前几天项目需要,做了一个背景遮罩的弹出框,html采用js动态添加进去的,结果发现angularjs绑定在这里面不起作用,搜索下解决了,记录下: var smallApplyParent = docu ...
- Object传入String类型和其他
是可以传入的. package com.sun.test; public class Test03 { /** * @param args */ public static void main(Str ...
- 使用linq获得当前文件夹下的下一级满足条件的文件夹
使用linq获得当前文件夹下的下一级满足条件的文件夹. SPFolderCollection subAlbums = Folder.SubFolders; ...
- [访问系统] Api_Win32_Mac类工具包 (转载)
点击下载 Api_Win32_Mac.zip using System; using System.Collections.Generic; using System.Linq; using Syst ...
- 搭建linux环境下jenkins可移植环境
1:背景 项目领域:android. 项目需求为:建立一个网站用于产品经理(以下称为PM)配置该apk所需服务插件,打包出包(包含:apk,文档,demo等等)给厂商并且记录打包出包等信息. 项目设计 ...
- 建立一个方法的attribute,可以放在任意方法上,可以自动记录方法出错时的信息,就不用写try 。。cacth. 【注意】 不是在asp.net MVC下,是在普通三层结构下写的的特性。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- C# -abstract, override, virtual, new
new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用. 而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子 ...
- Windows Azure 试用 for 世纪互联运维
前一段时间申请由世纪互联运维的和谐版Windows Azure的邀请嘛下来,今天花费了点时间注册了一下 注册邀请函, 根据提示输入邀请码之后会收到以下邮件 中国地区可选择建立的虚拟机,SQL Serv ...