HDU 2815 扩展baby step giant step 算法
题目大意就是求 a^x = b(mod c) 中的x
用一般的baby step giant step 算法会超时
这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4
map平衡树查找值
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <cmath>
- #include <map>
- using namespace std;
- #define ll long long
- int q_pow(int a , int b , int mod)
- {
- ll ans = ;
- while(b)
- {
- if(b&) ans =((ll)ans*a)%mod;
- a = ((ll)a*a)%mod;
- b>>=;
- }
- return ans;
- }
- int gcd(int a , int b)
- {
- if(b == )return a;
- else return gcd(b,a%b);
- }
- int ex_gcd(int a , int &x , int b , int &y)
- {
- if(b == ){
- x= , y=;
- return a;
- }
- int ans = ex_gcd(b , x , a%b , y);
- int t = x;
- x=y , y = t-a/b*y;
- return ans;
- }
- int inv(int a , int b , int mod)
- {
- int x , y , d;
- d = ex_gcd(a , x , mod , y);
- int e = (ll)x*b%mod;
- return e<?e+mod:e;
- }
- int BabyStep(int A,int B,int C){
- map<int,int> Hash;
- ll buf=%C,D=buf,K;
- int i,d=,tmp;
- for(i=;i<=;buf=buf*A%C,++i)
- if(buf==B) return i;
- while((tmp=gcd(A,C))!=)
- {
- if(B%tmp)return -;
- ++d;
- C/=tmp;
- B/=tmp;
- D=D*A/tmp%C;
- }
- Hash.clear();
- int M=(int)ceil(sqrt((double)C));
- for(buf=%C,i=;i<=M;buf=buf*A%C,++i)
- if(!Hash.count((int)buf))Hash[(int)buf]=i;
- for(i=,K=q_pow((ll)A,M,C);i<=M;D=D*K%C,++i)
- {
- tmp=inv(D,B,C);
- if(tmp>=&&Hash.count(tmp))return i*M+Hash[tmp]+d;
- }
- return -;
- }
- int main()
- {
- // freopen("a.in" ,"r" , stdin);
- int k , p , n;
- while(scanf("%d%d%d" , &k , &p , &n) == )
- {
- if(n>=p){
- puts("Orz,I can’t find D!");
- continue;
- }
- int ans = BabyStep(k , n , p);
- if(ans == -) puts("Orz,I can’t find D!");
- else printf("%d\n" , ans);
- }
- return ;
- }
hash表查找值(效率高很多)hash是线性查找:
- #include<iostream>
- #include<map>
- #include<cmath>
- #include <cstdio>
- using namespace std;
- typedef long long LL;
- const int maxn = ;
- struct hash{
- int a,b,next;
- }Hash[maxn << ];
- int flg[maxn + ];
- int top,idx;
- //hash值插入
- void ins(int a,int b){
- int k = b & maxn;
- if(flg[k] != idx){
- flg[k] = idx;
- Hash[k].next = -;
- Hash[k].a = a;
- Hash[k].b = b;
- return ;
- }
- while(Hash[k].next != -){
- if(Hash[k].b == b) return ;
- k = Hash[k].next;
- }
- Hash[k].next = ++ top;
- Hash[top].next = -;
- Hash[top].a = a;
- Hash[top].b = b;
- }
- //hash值查找
- int find(int b){
- int k = b & maxn;
- if(flg[k] != idx) return -;
- while(k != -){
- if(Hash[k].b == b) return Hash[k].a;
- k = Hash[k].next;
- }
- return -;
- }
- int gcd(int a,int b)
- {
- return b?gcd(b,a%b):a;
- }
- int ext_gcd(int a,int b,int& x,int& y)
- {
- int t,ret;
- if (!b){x=,y=;return a;}
- ret=ext_gcd(b,a%b,x,y);
- t=x,x=y,y=t-a/b*y;
- return ret;
- }
- int Inval(int a,int b,int n){
- int x,y,e;
- ext_gcd(a,n,x,y);
- e=(LL)x*b%n;
- return e<?e+n:e;
- }
- int pow_mod(LL a,int b,int c)
- {
- LL ret=%c;
- a%=c;
- while(b){
- if(b&)ret=ret*a%c;
- a=a*a%c;
- b>>=;
- }
- return ret;
- }
- int BabyStep(int A,int B,int C){
- top = maxn; ++ idx;
- LL buf=%C,D=buf,K;
- int i,d=,tmp;
- for(i=;i<=;buf=buf*A%C,++i)
- if(buf==B)return i;
- while((tmp=gcd(A,C))!=){
- if(B%tmp)return -;
- ++d;
- C/=tmp;
- B/=tmp;
- D=D*A/tmp%C;
- }
- int M=(int)ceil(sqrt(C+0.5));
- for(buf=%C,i=;i<=M;buf=buf*A%C,++i)
- ins(i,buf);
- for(i=,K=pow_mod((LL)A,M,C);i<=M;D=D*K%C,++i){
- tmp=Inval((int)D,B,C);
- int w ;
- if(tmp>=&&(w = find(tmp)) != -) return i*M+w+d;
- }
- return -;
- }
- int main(){
- int A,B,C;
- while(scanf("%d%d%d",&A,&C,&B)!=EOF){
- if(B>C){
- puts("Orz,I can’t find D!");
- continue;
- }
- int tmp=BabyStep(A,B,C);
- if(tmp<)
- puts("Orz,I can’t find D!");
- else printf("%d\n",tmp);
- }
- return ;
- }
HDU 2815 扩展baby step giant step 算法的更多相关文章
- HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法
联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- 【学习笔记】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 ...
- 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算法』
高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...
- [置顶] hdu2815 扩展Baby step,Giant step入门
题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...
- 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)
什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...
- POJ 2417 Discrete Logging ( Baby step giant step )
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3696 Accepted: 1727 ...
- 【POJ2417】baby step giant step
最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step ...
随机推荐
- Miller&&Pollard HDOJ 4344 Mark the Rope
题目传送门 题意:一个长为n(n<2^63)的管子,在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端.让你找出有多少个这样的L(L<n),且他们 ...
- synchronized(2)修饰方法之:普通方法
synchronized方法 [同一个对象的该方法一次只有一个线程可以访问,该对象的其它同步方法也被阻塞] 方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时, ...
- js类、原型——学习笔记
js 内置有很多类,我们用的,都是从这些类实例化出来的. function Object () {} function Array () {} function String () {} functi ...
- AJPFX解析Java关键字之assert
Java有许多关键字,但是这个关键字估计很少有人了解,今天就跟大家谈一谈这个关键字吧. 先说明一下,这个关键字开发中用的极少,感兴趣的朋友可以了解一下. 一.概述 在C和C++语言中都有assert关 ...
- struts2 源码地址
http://archive.apache.org/dist/struts/
- iOS之NSAttributedString-------字符属性
NSAttributedString 字符属性 字符属性可以应用于 attributed string 的文本中. NSString *const NSFontAttributeName;(字体) N ...
- table鼠标滑过变颜色
table鼠标滑过变颜色 添加 table tr:hover{background-color: #eee;} 设置鼠标滑过行背景变色,重新刷新浏览器页面. 一般设置灰色,eee
- C#运用存储过程新增一条记录并返回自动生成的ID
@Hcy黄灿奕:http://blog.sina.com.cn/iihcy 前言: 1.存储过的好处: 存储过程相对于其他的数据库访问方法有以下的优点: (1)重复使用.存储过程可以重复使用,从而可以 ...
- HTML a标签的href 属性 tel 点击可以直接拨打电话 ( 移动端 )
<a href="tel:13828172679">13622178579</a>
- 通过 GCC 学习 OpenMP 框架
OpenMP 框架是使用 C.C++ 和 Fortran 进行并发编程的一种强大方法.GNU Compiler Collection (GCC) V4.4.7 支持 OpenMP 3.0 标准,而 ...