BSGS算法

转自:http://blog.csdn.net/clove_unique

问题

给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$

题解

这就是经典的BSGS算法,方法如下:
令$x=im−j$,$m=⌈\sqrt{p}⌉$,则$a^{im−j}≡b(mod \ p)$
移项,得$(a^m)^i≡ba^j(mod \ p) $
首先,从$0−m$枚举$j$,将得到的$ba^j$的值存入hash表;
然后,从$1−m$枚举$i$,计算$(a^m)^i$,查表,如果有值与之相等,则当时得到的$im−j$是最小值。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<map>
  6. #include<cmath>
  7. #define int long long
  8. using namespace std;
  9. int p;
  10. int pw(int x,int y)
  11. {
  12. int lst=;
  13. while(y)
  14. {
  15. if(y&)lst=lst*x%p;
  16. y>>=;
  17. x=x*x%p;
  18. }
  19. return lst;
  20. }
  21. int xx,yy;
  22. void exgcd(int a,int b)
  23. {
  24. if(b==)
  25. {
  26. xx=;yy=;
  27. return ;
  28. }
  29. exgcd(b,a%b);
  30. int tmp=xx;
  31. xx=yy;
  32. yy=tmp-(a/b)*yy;
  33. return ;
  34. }
  35.  
  36. map<int,int>mp;
  37. int work(int a,int b)
  38. {
  39. int m=ceil(sqrt(p));
  40. mp.clear();
  41. int now=;
  42. mp[now*b%p]=;
  43. for(int i=;i<=m;i++)
  44. {
  45. now=now*a%p;
  46. mp[now*b%p]=i;
  47. }
  48. int tmp=;
  49. for(int i=;i<=m;i++)
  50. {
  51. tmp=tmp*now%p;
  52. if(mp[tmp])
  53. {
  54. return i*m-mp[tmp];
  55. }
  56. }
  57. return -;
  58. }
  59. int a,b,x1,t;
  60. signed main()
  61. {
  62. int cas;
  63. scanf("%lld",&cas);
  64. while(cas--)
  65. {
  66. scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);
  67. if(x1==t)
  68. {
  69. puts("");
  70. continue;
  71. }
  72. if(a==)
  73. {
  74. if(x1==t)puts("");
  75. else if(b==t)puts("");
  76. else puts("-1");
  77. continue;
  78. }
  79. if(a==)
  80. {
  81. if(!b)
  82. {
  83. if(x1==t)puts("");
  84. else puts("-1");
  85. continue;
  86. }
  87. exgcd(b,p);
  88. int tmp=(t-x1+p)%p;
  89. xx=((xx*tmp%p)+p)%p;
  90. xx++;
  91. printf("%lld\n",xx);
  92. }
  93. else
  94. {
  95. int c=pw(a-,p-);
  96. int t1=(x1+b*c)%p,t2=p,t3=(b*c+t)%p;
  97. exgcd(t1,t2);
  98. xx=(xx%p+p)%p;
  99. xx=(xx*t3)%p;
  100. int ans=work(a,xx);
  101. if(ans!=-)printf("%lld\n",ans+);
  102. else printf("%lld\n",ans);
  103. }
  104. }
  105. return ;
  106. }

bzoj 3122 : [Sdoi2013]随机数生成器 BSGS的更多相关文章

  1. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  2. bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.    接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...

  3. bzoj 3122: [Sdoi2013]随机数生成器【BSGS】

    题目要求的是: \[ ...a(a(a(ax+b)+b)+b)+b...=a^nx+a^{n-1}b+a^{n-2}b+...+b\equiv t(mod\ p) \] 后面这一大坨看着不舒服,所以考 ...

  4. bzoj 3122: [Sdoi2013]随机数生成器

    #include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...

  5. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  6. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  7. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

  8. 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用

    题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...

  9. [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列

    题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...

随机推荐

  1. hadoop最新稳定版本使用建议

    Apache Hadoop Apache版本衍化比较快,我给大家介绍一下过程 ApacheHadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop ...

  2. 新手Python第四天(生成器)

    Python 生成器 生成器和生成表达式 a=[i*2 for i in range(10)]#生成表达式 b=(i*2 for i in range(10))#生成器 生成器的特点:优点(不占用内存 ...

  3. layui数据表格使用(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

    表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...

  4. Java时间格式的使用,bug难时真是坑

    很简单的问题,尤其是新手开发,要多自己动手写代码,都说程序猿大都是程序的搬用工,其实不然,好的写手,和差的写手,区别就在是不是会花时间读读代码,并且自己动手实践一下,其实一个程序范这样的错误,绝对是低 ...

  5. Mongodb For Mac OSX && 登录验证

    题外话:尽管有不少人贴出了 <我不用mongodb的十大理由> 等系列文章,但是 NoSQL 的发展不会因此而止步, mongodb 是 NoSQL 的典型代表,楼主还是抱乐观态度的,有人 ...

  6. Thirteenth scrum meeting 2015/11/11

    发布bug整理集结: 手机用户体验优化优化: (1)主界面和课程界面的字体规格以及界面结构不同 (2)课程图片的大小格式不统一,造成美观下降 ( 3 )按钮的位置不美观 平板用户体验: (1)Tab键 ...

  7. [2017BUAA软工]结对项目:数独扩展

    结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...

  8. 面向对象程序设计第三次作业-Calculator

    题目: 最终代码: Scan.h: Print.h: Calaulator.cpp: 解题过程 看到题目后,在查询之后明白了这是多文件的题目,然后通过翁凯老师的视频讲解知道了.h和.cpp文件的区别和 ...

  9. 深入理解JAVA I/O系列三:字符流详解

    字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节 ...

  10. ABP ModuleZero后台框架materialize禁止模拟select和checkbox

    使用abp modulezero自带那个后台框架发现一个操蛋的问题,所有的select和checkbox都被改成div模拟的,虽然比原生美观,但有时候真的很难用. 比如说要用select做一个联动菜单 ...