Description

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

Input

输入包含多组数据。

第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同)。
以下行每行包含三个正整数y,z,p,描述一个询问。

Output

对于每个询问,输出一行答案。对于询问类型2和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”,注意逗号与“I”之间有一个空格。

Sample Input

【样例输入1】
3 1
2 1 3
2 2 3
2 3 3
【样例输入2】
3 2
2 1 3
2 2 3
2 3 3
【数据规模和约定】
对于100%的数据,1<=y,z,p<=10^9,为质数,1<=T<=10。

Sample Output

【样例输出1】
2
1
2
【样例输出2】
2
1
0
 
第一问第二问略过,第三问BSGS
-------------------------------------------------------------叫我分割线-----------------------------------------------------------
什么是BSGS呢?即baby-step-giant-step,翻译成中文就是小步大步法,用于解决类似x^y=z(mod  p) 求最小的y这样的问题(也许还能干别的,但本人弱渣,并不知道)
对于上面那个题目的推导
 
有点凌乱,等我想明白的再补
  1. #include<cstdio>
  2. #define ll long long
  3. #include<map>
  4. #include<cmath>
  5. using namespace std;
  6. int T,k;
  7. ll pow(ll x,int y,int p){
  8. ll ans=;
  9. while(y>){
  10. if (y&==) ans=(ans*x)%p;
  11. y=y>>;
  12. x=(x*x)%p;
  13. }
  14. return ans;
  15. }
  16.  
  17. int gcd(int x,int y){
  18. if (x%y==) return y;
  19. return gcd(y,x%y);
  20. }
  21.  
  22. void exgcd(int a,int b,int &x,int &y){
  23. if (b==){x=,y=;return;}
  24. exgcd(b,a%b,x,y);
  25. int t=x;x=y;y=t-(a/b)*y;
  26. }
  27.  
  28. void solve2(int a,int z,int b){
  29. int tmp=gcd(a,b),x,y;
  30. if (z%tmp){printf("Orz, I cannot find x!\n");return;}
  31. exgcd(a,b,x,y);
  32. x=((ll)x*(z/tmp))%b;
  33. while (x>) x-=b/tmp;
  34. while (x<) x+=b/tmp;
  35. printf("%d\n",x);
  36. }
  37.  
  38. map<int,int> mp;
  39. void solve3(int y,int z,int p){
  40. y%=p;
  41. if (!y&&!z) {printf("1\n");return;}
  42. if (!y){printf("Orz, I cannot find x!\n");return;}
  43. mp.clear();
  44. ll m=ceil(sqrt(p)),t=;
  45. mp[]=m+;//y^0==1;
  46. for (int i=;i<m;i++){
  47. t=t*y%p;
  48. if (!mp[t]) mp[t]=i;
  49. }
  50. ll tmp=pow(y,p--m,p),ine=;
  51. for (int k=;k<m;k++){
  52. int i=mp[z*ine%p];
  53. if (i){
  54. if (i==m+)i=;
  55. printf("%d\n",k*m+i);
  56. return;
  57. }
  58. ine=ine*tmp%p;
  59. }
  60. printf("Orz, I cannot find x!\n");
  61. }
  62.  
  63. int main(){
  64. scanf("%d%d",&T,&k);
  65. while (T--){
  66. int y,z,p;
  67. scanf("%d%d%d",&y,&z,&p);
  68. if (k==) printf("%lld\n",pow(y,z,p));
  69. if (k==) solve2(y,z,p);
  70. if (k==) solve3(y,z,p);
  71. }
  72. }

【BZOJ 2242】[SDOI2011]计算器的更多相关文章

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

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

  2. BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )

    没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...

  3. BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]

    2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...

  4. bzoj 2242 [SDOI2011]计算器(数论知识)

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

  5. BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)

    同余方程都不会写了..还一直爆int /* 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元 首先a%p=0时 仅当b=0时有解:然后有x ≡b*a^-1( ...

  6. BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2242 [题目大意] 给出T和K 对于K=1,计算 Y^Z Mod P 的值 对于K=2 ...

  7. bzoj 2242 [SDOI2011]计算器——BSGS模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一道BSGS! 咳咳,我到底改了些什么?…… 感觉和自己的第一版写的差不多……可能是 ...

  8. BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD

    题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...

  9. bzoj 2242: [SDOI2011]计算器

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

  10. [原博客] BZOJ 2242 [SDOI2011] 计算器

    题目链接 noip级数论模版题了吧.让求三个东西: 给定y,z,p,计算`Y^Z Mod P` 的值. 给定y,z,p,计算满足`xy≡ Z ( mod P )`的最小非负整数. 给定y,z,p,计算 ...

随机推荐

  1. 关于js中event的target和currentTarget的区别

    今天又遇到这个问题了,总是搞不清楚target和currentTarget的区别,百度搜索的时候看到一遍文章解释得很清楚,特意记录下录,以备不时之需: target与currentTarget的区别? ...

  2. Active Session History (ASH) Performed An Emergency Flush Messages In The Alert Log

    Active Session History (ASH) Performed An Emergency Flush Messages In The Alert Log (文档 ID 1385872.1 ...

  3. [改善Java代码]使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举 ...

  4. [设计模式]<<设计模式之禅>>模板方法模式

    1 辉煌工程——制造悍马 周三,9:00,我刚刚坐到位置上,打开电脑准备开始干活. “小三,小三,叫一下其他同事,到会议室开会”,老大跑过来吼,带着坏笑.还没等大家坐稳,老大就开讲了:“告诉大家一个好 ...

  5. [BigData]关于Hadoop学习笔记第一天(PPT总结)(一)

    适合大数据的分布式存储与计算平台 l作者:Doug Cutting l受Google三篇论文的启发   lApache 官方版本(1.0.4) lCloudera 使用下载最多的版本,稳定,有商业支持 ...

  6. javascript-函数进阶

    一.函数定义 1.函数声明 function add(i,j){ return i+j; } 特点:1.函数声明定义函数会被前置.要知道在js代码执行时,会有一个预解析,预解析时会把变量声明.函数声明 ...

  7. ASP判断当前页面上是否有参数ID传递过来

    遇到了一个这样的ASP问题: 在当前页面上判断,是否有参数ID传递过来? 如果没有,显示“没有参数传递过来”. 如果有传递,但值为空,显示“存在参数,但参数为空” <% if (request( ...

  8. Java加密解密相关

    关于解释加密解密中的填充方案: http://laokaddk.blog.51cto.com/368606/461279/ 关于对称加密中的反馈模式: http://blog.csdn.net/aaa ...

  9. PHP获取本周第一天和最后一天

    //本周的第一天和最后一天  代码如下 复制代码 $date=new DateTime();$date->modify('this week');$first_day_of_week=$date ...

  10. Cocos2d-x开发中Ref内存管理

    Ref类是Cocos2d-x根类,Cocos2d-x中的很多类都派生自它,例如,我们熟悉的节点类Node也派生自Ref.我们介绍Ref内存管理.内存引用计数Ref类设计来源于Cocos2d-iphon ...