k=1:裸的快速幂
k=2:xy=z+kp,直接exgcd,这个可以不用解释了,不懂的同学可以看代码
k=3:裸的BSGS
重点是k=3(BSGS学习)
ax=b(mod p)求解这个同余方程
只能求gcd(a,p)=1的情况。
如何求解?很容易发现解一定位于{0,p-1}之间,设q=ceil(√p),然后x可以表示成cq-d
因为ax=b(mod p),所以acq=b*ad(mod p)
于是可以这样考虑:枚举d∈[1,q],将值插入哈希表,如有重复的则只记录最大的d,因为本题是求最小解,再枚举c=1...q,查询acq是否在哈希表内,如果在就可以直接跳出来。
注意要特判a或b等于0的情况就可以了。
不说太多了,直接上模板:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. map<int,int>hsh;
  5. ll y,z,p;
  6. ll qpow(ll a,ll b)
  7. {
  8. a%=p;
  9. ll ret=;
  10. while(b)
  11. {
  12. if(b&)ret=ret*a%p;
  13. a=a*a%p,b>>=;
  14. }
  15. return ret;
  16. }
  17. ll exgcd(ll a,ll b,ll&x,ll&y)
  18. {
  19. if(b==){x=,y=;return a;}
  20. ll ret=exgcd(b,a%b,y,x);y-=a/b*x;
  21. return ret;
  22. }
  23. void solve2(ll a,ll b)
  24. {
  25. ll x,y,ans,d,s;
  26. d=exgcd(a,p,x,y);
  27. if(b%d){puts("Orz, I cannot find x!");return;}
  28. ans=b/d*x;
  29. s=p/d;
  30. ans=(ans%s+s)%s;
  31. printf("%lld\n",ans);
  32. }
  33. void solve3()
  34. {
  35. y%=p,z%=p;
  36. if(!y)
  37. {
  38. if(!z)puts("");else puts("Orz, I cannot find x!");
  39. return;
  40. }
  41. ll m=ceil(sqrt(p)),v=qpow(y,p-m-),e=,ret;
  42. hsh.clear();
  43. hsh[]=m+;
  44. for(ll i=;i<=m;i++)
  45. {
  46. e=e*y%p;
  47. if(!hsh[e])hsh[e]=i;
  48. }
  49. ret=-;
  50. for(ll i=;i<m;i++)
  51. {
  52. if(hsh[z]){ret=i*m+(hsh[z]==m+?:hsh[z]);break;}
  53. z=z*v%p;
  54. }
  55. if(ret==-)puts("Orz, I cannot find x!");
  56. else printf("%d\n",ret);
  57. }
  58. int main()
  59. {
  60. int T,k;
  61. scanf("%d%d",&T,&k);
  62. while(T--)
  63. {
  64. scanf("%lld%lld%lld",&y,&z,&p);
  65. if(k==)printf("%lld\n",qpow(y,z));
  66. else if(k==)solve2(y,z);
  67. else solve3();
  68. }
  69. }

[SDOI2011]计算器(exgcd&BSGS)的更多相关文章

  1. 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS

    题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...

  2. BZOJ2242[SDOI2011]计算器——exgcd+BSGS

    题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...

  3. BZOJ2242 [SDOI2011]计算器 【BSGS】

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4741  Solved: 1796 [Submit][Sta ...

  4. BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS

    三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...

  5. 【洛谷 P2485】 [SDOI2011]计算器 (BSGS)

    题目链接 第一问:快速幂 第二问:扩欧解线性同余方程 第三问:\(BSGS\) 三个模板 #include <cstdio> #include <cmath> #include ...

  6. 牛客20347 SDOI2011计算器(bsgs

    https://ac.nowcoder.com/acm/problem/20347 这篇是为了补bsgs(北上广深算法). 题意: 1.给定y,z,p,计算Y^Z Mod P 的值:  2.给定y,z ...

  7. [SDOI2011]计算器(BSGS)

    洛古题面 对于操作一,用快速幂算即可 代码如下 int quickpow(int a,int b,int k) { int r=1; while(b) { if(b&1) r=(r*a)%k; ...

  8. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  9. BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS

    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

  10. 【BZOJ2242】[SDOI2011]计算器 BSGS

    [BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...

随机推荐

  1. socket基础编程-2

    client端: import socket while True: client=socket.socket(socket.ANET,socket.SOCK_STREAM) client.conne ...

  2. redhat7通过yum安装nginx最新版

    1.准备yum源 vi /etc/yum.repo.d/nginx.repo [nginx]name=nginx repobaseurl=http://nginx.org/packages/mainl ...

  3. 莫烦theano学习自修第五天【定义神经层】

    1. 代码如下: #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ import numpy as np import theano.tensor as T ...

  4. npm 设置代理

    设置代理 npm config set proxy http://username:password@server:portnpm config set https-proxy http://user ...

  5. ASP.Net Post方式获取数据流的一种简单写法

    public static string PostWebReq(string PostUrl, string ParamData, Encoding DataEncode)        {      ...

  6. Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  7. React 学习(七) ---- create-react-app

    现在react 基础知识已经算是学完了,知道了React是做什么的,以及怎么使用,是时候学习一个webpack, babel 等现代化前端开发了,真正做项目的时候,我们不可能再使用babel 的线上编 ...

  8. DRF 版本 认证

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢大家都知道我们开发项目是有多个版本的 当我们项目越来越更新~版本就越来越多我们不可能新的版本出了~以前旧的版本 ...

  9. HDU5773-The All-purpose Zero-多校#41010-最长上升子序列问题

    只想到了朴素的n^2做法,然后发现可以用splay维护.于是调了几个小时的splay... splay的元素是从第二个开始的!第一个是之前插入的头节点! #include <cstdio> ...

  10. BZOJ 1977 严格次小生成树(算竞进阶习题)

    树上倍增+kruskal 要找严格次小生成树,肯定先要找到最小生成树. 我们先把最小生成树的边找出来建树,然后依次枚举非树边,容易想到一种方式: 对于每条非树边(u,v),他会与树上的两个点构成环,我 ...