题目大意就是求 a^x = b(mod c) 中的x

用一般的baby step giant step 算法会超时

这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4

map平衡树查找值

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <cmath>
 5 #include <map>
 6 using namespace std;
 7 #define ll long long
 8
 9 int q_pow(int a , int b , int mod)
10 {
11     ll ans = 1;
12     while(b)
13     {
14         if(b&1) ans =((ll)ans*a)%mod;
15         a = ((ll)a*a)%mod;
16         b>>=1;
17     }
18     return ans;
19 }
20
21 int gcd(int a , int b)
22 {
23     if(b == 0)return a;
24     else return gcd(b,a%b);
25 }
26
27 int ex_gcd(int a , int &x , int b , int &y)
28 {
29     if(b == 0){
30         x=1 , y=0;
31         return a;
32     }
33     int ans = ex_gcd(b , x , a%b , y);
34     int t = x;
35     x=y , y = t-a/b*y;
36     return ans;
37 }
38
39 int inv(int a , int b , int mod)
40 {
41     int x , y , d;
42     d = ex_gcd(a , x , mod , y);
43     int e = (ll)x*b%mod;
44     return e<0?e+mod:e;
45 }
46
47 int BabyStep(int A,int B,int C){
48     map<int,int> Hash;
49     ll buf=1%C,D=buf,K;
50     int i,d=0,tmp;
51     for(i=0;i<=100;buf=buf*A%C,++i)
52         if(buf==B) return i;
53     while((tmp=gcd(A,C))!=1)
54     {
55         if(B%tmp)return -1;
56         ++d;
57         C/=tmp;
58         B/=tmp;
59         D=D*A/tmp%C;
60     }
61     Hash.clear();
62     int M=(int)ceil(sqrt((double)C));
63     for(buf=1%C,i=0;i<=M;buf=buf*A%C,++i)
64         if(!Hash.count((int)buf))Hash[(int)buf]=i;
65     for(i=0,K=q_pow((ll)A,M,C);i<=M;D=D*K%C,++i)
66     {
67         tmp=inv(D,B,C);
68         if(tmp>=0&&Hash.count(tmp))return i*M+Hash[tmp]+d;
69     }
70     return -1;
71 }
72 int main()
73 {
74    // freopen("a.in" ,"r" , stdin);
75     int k , p , n;
76     while(scanf("%d%d%d" , &k , &p , &n) == 3)
77     {
78         if(n>=p){
79             puts("Orz,I can’t find D!");
80             continue;
81         }
82         int ans = BabyStep(k , n , p);
83         if(ans == -1) puts("Orz,I can’t find D!");
84         else printf("%d\n" , ans);
85     }
86     return 0;
87 }

View Code

hash表查找值(效率高很多)hash是线性查找:

  1 #include<iostream>
  2 #include<map>
  3 #include<cmath>
  4 #include <cstdio>
  5 using namespace std;
  6 typedef long long LL;
  7 const int maxn = 65535;
  8 struct hash{
  9     int a,b,next;
 10 }Hash[maxn << 1];
 11 int flg[maxn + 66];
 12 int top,idx;
 13 //hash值插入
 14 void ins(int a,int b){
 15     int k = b & maxn;
 16     if(flg[k] != idx){
 17         flg[k] = idx;
 18         Hash[k].next = -1;
 19         Hash[k].a = a;
 20         Hash[k].b = b;
 21         return ;
 22     }
 23     while(Hash[k].next != -1){
 24         if(Hash[k].b == b) return ;
 25         k = Hash[k].next;
 26     }
 27     Hash[k].next = ++ top;
 28     Hash[top].next = -1;
 29     Hash[top].a = a;
 30     Hash[top].b = b;
 31 }
 32 //hash值查找
 33 int find(int b){
 34     int k = b & maxn;
 35     if(flg[k] != idx) return -1;
 36     while(k != -1){
 37         if(Hash[k].b == b) return Hash[k].a;
 38         k = Hash[k].next;
 39     }
 40     return -1;
 41 }
 42 int gcd(int a,int b)
 43 {
 44     return b?gcd(b,a%b):a;
 45 }
 46 int ext_gcd(int a,int b,int& x,int& y)
 47 {
 48     int t,ret;
 49     if (!b){x=1,y=0;return a;}
 50     ret=ext_gcd(b,a%b,x,y);
 51     t=x,x=y,y=t-a/b*y;
 52     return ret;
 53 }
 54 int Inval(int a,int b,int n){
 55     int x,y,e;
 56     ext_gcd(a,n,x,y);
 57     e=(LL)x*b%n;
 58     return e<0?e+n:e;
 59 }
 60 int pow_mod(LL a,int b,int c)
 61 {
 62     LL ret=1%c;
 63     a%=c;
 64     while(b){
 65         if(b&1)ret=ret*a%c;
 66         a=a*a%c;
 67         b>>=1;
 68     }
 69     return ret;
 70 }
 71 int BabyStep(int A,int B,int C){
 72     top = maxn; ++ idx;
 73     LL buf=1%C,D=buf,K;
 74     int i,d=0,tmp;
 75     for(i=0;i<=100;buf=buf*A%C,++i)
 76         if(buf==B)return i;
 77     while((tmp=gcd(A,C))!=1){
 78         if(B%tmp)return -1;
 79         ++d;
 80         C/=tmp;
 81         B/=tmp;
 82         D=D*A/tmp%C;
 83     }
 84     int M=(int)ceil(sqrt(C+0.5));
 85     for(buf=1%C,i=0;i<=M;buf=buf*A%C,++i)
 86         ins(i,buf);
 87     for(i=0,K=pow_mod((LL)A,M,C);i<=M;D=D*K%C,++i){
 88         tmp=Inval((int)D,B,C);
 89         int w ;
 90         if(tmp>=0&&(w = find(tmp)) != -1) return i*M+w+d;
 91     }
 92     return -1;
 93 }
 94 int main(){
 95     int A,B,C;
 96     while(scanf("%d%d%d",&A,&C,&B)!=EOF){
 97         if(B>C){
 98             puts("Orz,I can’t find D!");
 99             continue;
100         }
101         int tmp=BabyStep(A,B,C);
102         if(tmp<0)
103             puts("Orz,I can’t find D!");
104         else printf("%d\n",tmp);
105     }
106     return 0;
107 }

View Code

转载于:https://www.cnblogs.com/CSU3901130321/p/4266674.html

HDU 2815 扩展baby step giant step 算法相关推荐

  1. NOI数学:大步小步(Baby Step Giant Step,BSGS)算法

    BSGS算法求 高次同余方程:1.可爱的质数 2.计算器 BSGS算法求 高次同余方程:1.可爱的质数 2.计算器_啦啦啦32421的博客-CSDN博客 大步小步算法(BSGS)及扩展 & b ...

  2. 离散对数(Baby Step Giant Step)

    现在我来介绍一种算法叫做Baby Step Giant Step.它是用来解决如下方程最小正整数解的     其中 如果,那么我们可以先取模,即,所以在这里我们只讨论的情况. 普通Baby Step ...

  3. 【数学】Baby Step,Giant Step

    给定整数 a,b,pa,b,pa,b,p 且 a,pa,pa,p 互质,请求出高次同余方程 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的非负整数解. 首先, a0≡ ...

  4. BZOJ 2242([SDOI2011]计算器-Baby Step Giant Step第1题)

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 744  Solved: 289 [Submit][Statu ...

  5. bsgs(Baby Steps Giant Steps)算法

    BSGS算法(Baby Steps Giant Steps算法,大步小步算法,北上广深算法,拔山盖世算法) 适用问题 对于式子: $$x^y=z(mod_p)$$ 已知x,z,p,p为质数: 求解一个 ...

  6. Egg 1. 快速开始 Quick Start 1.3 一步步 Step by Step 1.3.6 添加扩展 ~ 1.4 结论

    Egg Egg 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Egg 1. 快速开始 Quick Start 1.3 一步步 Step by Step 1.3.6 添加扩展 1.3.7 添 ...

  7. JWT 介绍 - Step by Step

    翻译自 Mohamad Lawand 2021年3月11日的文章 <Intro to JWT - Step by Step> [1] 在本文中,我将向您介绍 JWT[2]. 我们今天要讲的 ...

  8. 文本分类step by step(二)

    (注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...

  9. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...

    面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题. ActionScript 3 ...

  10. Enterprise Library Step By Step系列(一):配置应用程序块——入门篇

    写在前面: 最近准备写Enterprise Library Step By Step的系列文章,对于每一个应用程序块,我都会用入门篇,进阶篇,剖析篇三篇文章去写. 在入门篇里会详细介绍应用程序块的使用 ...

最新文章

  1. oracle数据库物理结构包含,Oracle - 数据库物理结构
  2. HDU 4432 Sum of divisors 2012 Asia Tianjin Regional Contest
  3. Google 开源 VHP 震动触觉平台,降低触觉设备开发难度
  4. java 动态创建数据库和动态连接数据库
  5. WinPhone 开发(2)-----应用程序栏ApplicationBar
  6. python marshal 对象序列化和反序列化
  7. Jfinal的七牛云存储插件:qiniuPlugin for jfinal.
  8. 数学建模5 代码论文降重 Excel表处理数据
  9. 计算机二级报考哪个科目比较好?
  10. Nginx设置跨域配置
  11. 平面设计基础(PS)知识点总结
  12. python中的array函数作用_Python中的numpy常用函数整理
  13. linux下调用pyd文件,linux pyd
  14. 食品经营许可证模板_食品流通许可证与食品经营许可证
  15. ttkefu如何修改手机聊天窗口的背景颜色?
  16. 解决Windows 10不显示打字框
  17. 前端(内部)-编程规约
  18. [置顶]kubernetes资源类型--secret和Service Account
  19. C++最小生成树Kruskal算法
  20. 《腾讯桌球》日活300万!盘点LayaAir引擎的3D小游戏!

热门文章

  1. 如何利用OUTLOOK提高你的工作效率
  2. u盘安装centos7.0
  3. Redis入门到精通-姜海强-专题视频课程
  4. Qt5学习笔记之零碎问题记录
  5. linux设备驱动归纳总结--转载小白的博客
  6. Java和C的关系及发展历程
  7. kubernetes session回话保持
  8. insertBefore方法(javascript与jQuery)
  9. 嵌入Windows User Control到ASP.NET web form
  10. 企业中该如何防止僵尸网络的入侵?