题目大意:三合一,给你$y,z,p$,求$x$,三种询问

  1. $y^z\bmod{p}$
  2. $xy\equiv z\pmod p$的最小非负整数
  3. $y^z\equiv z\pmod p$的最小非负整数

题解:求快速幂,逆元和$BSGS(离散对数)$

$BSGS$就是用分块的思想,令$m=\lceil \sqrt p\rceil$,因为$y^{i\times m+j}=y^{i\times m}\times y^j$所以可以预处理$y^i$(用$hash$或$map(加复杂度和大常数,但是方便。。。)$ $(unordered\_map是C++11的,考前还是不要用了吧)$,然后枚举$i$,求出$y^{i\times m}$,找一下有没有对应的$y^j$就行了

卡点:

C++ Code:

#include <cstdio>
#include <cmath>
#include <map>
long long T, k;
long long y, z, p;
namespace calc1 {long long calc (long long base, long long p, long long mod) {base %= mod, p %= mod - 1;long long ans = 1;for (; p; p >>= 1, base = base * base % mod) if (p & 1) ans = ans * base % mod;return ans;}long long inv(long long a, long long mod) {return calc(a, mod - 2, mod);}
}
namespace calc2 {long long calc (long long y, long long z, long long mod) {y %= mod, z %= mod;if (!y) return z ? -1 : 0;long long tmp = calc1::inv(y, mod);return tmp * z % mod;}
}
namespace calc3 {std::map<int, int> mp;long long calc(long long y, long long z, long long mod) {y %= mod, z %= mod;if (!y) return -1;long long tmp = 1, t = sqrt(mod - 1) + 1; mp.clear();for (int i = 0; i <= t; i++) {mp[tmp * z % mod] = i;if (i != t) tmp = tmp * y % mod;}long long tmp6 = tmp;for (int i = 1; i <= t; i++) {if (mp.count(tmp6)) return i * t - mp[tmp6];tmp6 = tmp6 * tmp % mod;}return -1;}
}
int main() {scanf("%lld%lld", &T, &k);while (T --> 0) {scanf("%lld%lld%lld", &y, &z, &p);long long tmp;switch (k) {case 1: tmp = calc1::calc(y, z, p); break;case 2: tmp = calc2::calc(y, z, p); break;case 3: tmp = calc3::calc(y, z, p); break;}if (tmp == -1) puts("Orz, I cannot find x!");else printf("%lld\n", tmp);}
}

转载于:https://www.cnblogs.com/Memory-of-winter/p/9571523.html

[bzoj2242][SDOI2011]计算器相关推荐

  1. [bzoj2242] [SDOI2011]计算器

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

  2. bzoj2242 [SDOI2011]计算器 exgcd+ksm+bsgs

    三个板子,注意bsgs的时候要特判无解,即a%p==0||b%p==0(bsgs还是很巧妙的..) 码: #include<iostream> #include<cstdio> ...

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

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

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

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

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

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

  6. 【codevs1565】【BZOJ2242】计算器,数论练习

    计算器 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算 ...

  7. luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法

    BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...

  8. [SDOI2011] 计算器

    题目链接:戳我 三合一?? 第一问是..快速幂. 第二问求逆元.最后乘上z即可. 第三问bsgs模板了. bsgs不会?戳我 代码如下: #include<cstdio> #include ...

  9. [SDOI2011]计算器 BSGS

    前两个操作都看出来做法了,第三个要用到BSGS这个算法 BSGS主要可以解 a^x=b(mod n)的 0<=x<n 的解 暂时先拿kb和hzwer的板子当黑盒吧..数论细节短时间内没有学 ...

最新文章

  1. strcpy与面试官
  2. Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
  3. Python常用模块之configparser模块
  4. 如何高效安全的将资源同步到本地数据库
  5. 服务器集群后产生那些问题
  6. python语言的两种注释方法_python编程时添加中文注释的方法
  7. Vue学习笔记01:准备开发与调试环境
  8. 如何最快的销售砖头(2.0版)
  9. mysql安装包提示选项_Windows操作系统安装MySQL解压版
  10. 7.微服务:从设计到部署 --- 重构单体应用为微服务
  11. 报表如何集成 echarts 官网示例图
  12. GIF图像动态生成-JAVA后台生成
  13. dw常用标签_Dreamweaver制作基本标签
  14. Tiny6410 SD卡启动裸机程序
  15. 一键还原的GHO文件夹打开方法(转载)
  16. 人脸识别(81关键点)经典开源核心代码
  17. MATLAB Jacobi迭代法 求解线性方程组
  18. 使用cocos2d-x实现一款类似《Flappy Bird》的游戏
  19. 计算机硬盘清理,电脑磁盘满了怎样清理
  20. google的开源工程,真多

热门文章

  1. 内蒙古计算机专修学院单招,内蒙古电子信息职业技术学院单招多少分能上?
  2. java计算器监听_计算器及事件监听
  3. 微带线特性阻抗计算公式_利用HFSS计算微带线的特性阻抗
  4. java lang保_java.lang.Object的受保护方法如何保护子类?
  5. flash大作业一分钟源文件_初中生写作业慢的7个原因及对策
  6. ib课程计算机科学内容,新的IB计算机课程主要学习什么内容?有什么新的特点呢?...
  7. python微信开发实例 pdf 百度网盘_用python看女神微信里的百度云资源有啥?
  8. html制作统计期末成绩,JS-结合html综合练习js的对象——班级成绩表制作
  9. Asp.Net第一章入门之后台处理程序
  10. pandas之shift()函数