嗯哼大步小步法。

一个非常暴力的想法.

注意到如果设C = ⌈√P⌉,那么任何一个数都可以写

成a1 * C + b1的形式,其中a1, b1 都< C.

那么预处理出A^i*C的值.然后在询问时枚举b1.

A^a1*C-b1 = B,A^a1*C = B * A^b1.

把A^b1乘一下,再去hash表里查找是否有对应的值即可.

复杂度为O(√P)

//POJ 2417

  1. #include<cstdlib>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<iostream>
  6. #include<map>
  7. #include<cmath>
  8. using namespace std;
  9. typedef long long ll;
  10. map<ll,int>mmp;
  11. int qmod(ll a,ll b,ll p)
  12. {
  13. ll ans=;
  14. while(b)
  15. {
  16. if(b&)ans=ans*a%p;
  17. a=a*a%p;b>>=;
  18. }
  19. return ans;
  20. }
  21. int main()
  22. {
  23. ll p,a,b;
  24. while(~scanf("%lld%lld%lld",&p,&a,&b))
  25. {
  26. mmp.clear();
  27. if(a%p==)
  28. {
  29. puts("no solution");
  30. continue;
  31. }
  32. bool flag=;
  33. ll ans=;
  34. int c=ceil(sqrt(p));
  35. for(int i=;i<=c;++i)
  36. {
  37. if(i==)
  38. {
  39. ans=b%p;mmp[ans]=i;continue;
  40. }
  41. ans=ans*a%p;
  42. mmp[ans]=i;
  43. }
  44. ll tmp=qmod(a,c,p);ans=;
  45. for(int i=;i<=c;++i)
  46. {
  47. ans=ans*tmp%p;
  48. if(mmp[ans])
  49. {
  50. tmp=i*c-mmp[ans];
  51. printf("%d\n",(tmp%p+p)%p);
  52. flag=;
  53. break;
  54. }
  55. }
  56. if(!flag)puts("no solution");
  57. }
  58. return ;
  59. }

BSGS算法学习的更多相关文章

  1. BSGS算法学习笔记

    从这里开始 离散对数和BSGS算法 扩展BSGS算法 离散对数和BSGS算法 设$x$是最小的非负整数使得$a^{x}\equiv b\ \ \ \pmod{m}$,则$x$是$b$以$a$为底的离散 ...

  2. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

  3. 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法

    BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...

  4. DSP算法学习-过采样技术

    DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...

  5. 算法学习之C语言基础

    算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...

  6. Python之路,Day21 - 常用算法学习

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  7. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  8. [BSGS算法]纯水斐波那契数列

    学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...

  9. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

随机推荐

  1. webpack实现“热更新”和“热加载”(webpack3.6新增)

    之前的博文有提到怎么样去实现热更新,但是居然要用到另外一个node框架(express)而且新增了一个入口(entry)两个插件(plugin)来实现,大大提高了配置的复杂度,这样其实对使用webpa ...

  2. bzoj千题计划234:bzoj3802: Vocabulary

    http://www.lydsy.com/JudgeOnline/problem.php?id=3802 dp[i][0/1/2/3]  表示前i个字母,第1.2个字符串,第2.3个字符串的关系分别为 ...

  3. kali更新失败

    今天更新kali时失败,出现如下问题: root@kali:~# apt-get update Get: http://mirrors.aliyun.com/kali kali-rolling InR ...

  4. Hibernate常用的Java数据类型映射到mysql和Oracle

    研究了常用的Java基本数据类型在mysql和oracle数据库的映射类型.这里使用的是包装类型做研究,一般在hibernate声明的时候最好不要用基本类型,因为数据库中的null空数据有可能映射为基 ...

  5. 【ARTS】01_07_左耳听风-20181224~1230

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. linux中断申请之request_threaded_irq【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21977330&id=3755609 在linux里,中断处理分 ...

  7. shell脚本 ------ 输出带颜色的字体

    shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e “\033[字背景颜色:文字颜色m字符串\033[0m” 例如: echo -e “\03 ...

  8. SQL Server 连接池 (ADO.NET) MSDN

    连接到数据库服务器通常由几个需要很长时间的步骤组成. 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前 ...

  9. Java中包的介绍

    包的介绍: 未命名包 命名包 可以避免类名重复 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2. ...

  10. 图学ES6-1.ECMAScript 6简介