Description

你被要求设计一个计算器完成以下三项任务:

1、给定y、z、p,计算y^z mod p 的值;

2、给定y、z、p,计算满足xy ≡z(mod p)的最小非负整数x;

3、给定y、z、p,计算满足y^x ≡z(mod p)的最小非负整数x。

为了拿到奖品,全力以赴吧!

Input

输入文件calc.in 包含多组数据。

第一行包含两个正整数T、L,分别表示数据组数和询问类型(对于一个测试点内的所有数

据,询问类型相同)。

以下T 行每行包含三个正整数y、z、p,描述一个询问。

Output

输出文件calc.out 包括T 行.

对于每个询问,输出一行答案。

对于询问类型2 和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”。

Sample Input#1

3 1

2 1 3

2 2 3

2 3 3

Sample Output#1

2

1

2

Sample Input#2

3 2

2 1 3

2 2 3

2 3 3

Sample Output#2

2

1

0

Sample Input#3

4 3

2 1 3

2 2 3

2 3 3

2 4 3

Sample Output#3

0

1

Orz, I cannot find x!

0

Hint

对于20%的数据,K=1

对于35%的数据,K=2

对于45%的数据,K=3

对于100%的数据,\(为质数1 \leq y,z,P \leq 10^9 ,P为质数,1 \leq T \leq 10\).

Solution

对于K=1 快速幂即可。

对于K=2 移项得$x \equiv \frac{z}{y}\ (mod\ p) \Rightarrow x \equiv zy^{-1}\ (mod\ p) $求逆元即可。

对于K=3,bsgs即可。

介绍一下包身工树(Baby steps Giant steps):

根据欧拉定理,答案显然不超过\(\varphi(p)\) ,即\(p-1\).

考虑分块作答,确定一个阈值K,设x=aK+b,那么\(y^{aK+b} \equiv z\ (mod \ p) \Leftrightarrow y^{ak} \equiv zy^{-b}\ (mod\ p)\)

显然\(b\)的取值只有k种,\(a\)的取值只有\(p/k\)种,预处理出同余式右边,扔到数据结构维护一下,然后枚举左边check计算即可,记得优先保证答案最小。bsgs的优化:上述是要求逆元的,事实上,将\(x\)设为\(aK-b\)就可以巧妙的避免逆元了。显然在\(K=\sqrt {\varphi(p)}\) 时,时间复杂度最优。

Code

#include <stdio.h>
#include <math.h>
#include <map>
#define R register
#define ll long long
inline int read(){
R int x; R bool f; R char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<1)+(x<<3)+c-'0');
return f?-x:x;
}
int T,tp,y,z,p;
std::map<int,int> mp;
inline int pw(int x,int k,int p){
R int res=1;
for (; k; k>>=1,x=(ll)x*x%p) if (k&1) res=(ll)res*x%p;
return res;
}
inline void bsgs(int y,int z,int p){
if (y==0&&z==0) return (void)(puts("1"));
if (y==0) return (void)(puts("Orz, I cannot find x!"));
R int m=sqrt(p)+0.5;mp.clear();R int tmp=0;for (R int i=0; i<=m; ++i){
if (i==0) {tmp=z%p; mp[tmp]=0; continue;}
tmp=(ll)tmp*y%p;
mp[tmp]=i;
}R int t=pw(y,m,p);tmp=1;
for (R int i=1; i<=m; ++i){
tmp=(ll)tmp*t%p;
if (mp.count(tmp)){
R ll ans=((ll)i*m)-mp[tmp];
ans=(ans%p+p)%p;
printf("%lld\n",ans);
return;
}
}puts("Orz, I cannot find x!");return;
}
int main(){
T=read(),tp=read();
while(T--){
y=read(),z=read(),p=read();y%=p;
if (tp==1) printf("%d\n",pw(y,z,p));
else if (tp==2){
z%=p;if (y==0&&z!=0) puts("Orz, I cannot find x!");
else printf("%lld\n",(ll)z*pw(y,p-2,p)%p);
}else bsgs(y,z,p);
}
}

【BZOJ2242】【SDOI2011】计算器的更多相关文章

  1. [bzoj2242][Sdoi2011]计算器_exgcd_BSGS

    计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...

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

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

  3. BZOJ2242 [SDOI2011]计算器

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

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

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

  5. bzoj2242: [SDOI2011]计算器 BSGS+exgcd

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

  6. 【数学 BSGS】bzoj2242: [SDOI2011]计算器

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

  7. [bzoj2242][SDOI2011][计算器] (Baby-Step-Giant-Step+快速幂+exgcd)

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

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

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

  9. 2018.12.18 bzoj2242: [SDOI2011]计算器(数论)

    传送门 数论基础题. 对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs 于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了 ...

  10. bzoj千题计划246:bzoj2242: [SDOI2011]计算器

    http://www.lydsy.com/JudgeOnline/problem.php?id=2242 #include<map> #include<cmath> #incl ...

随机推荐

  1. 第一次作业:扑通扑通 我的IT

    让我掉下眼泪的不止昨夜的酒,还有这满屏的代码. 第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 在炎炎的夏日,伴随这高三的结束,我也面临大学专业的选择,我看着书里密 ...

  2. 开始使用HTML5和CSS3验证表单

    使用HTML5和CSS3验证表单 客户端验证是网页客户端程序最常用的功能之一,我们之前使用了各种各样的js库来进行表单的验证.HTML5其实早已为我们提供了表单验证的功能.至于为啥没有流行起来估计是兼 ...

  3. HTML事件处理程序

    事件处理程序中的代码执行时,有权访问全局作用域中任何代码. //为按钮btn_event添加了两个个事件处理程序,而且该事件会在冒泡阶段触发(最后一个参数是false). var btn_event ...

  4. dede使用心得

    Question one: 最近做了一些视频教程传到优酷网站上,但我想引入这些视频教程到我的网站,在发表时我发现织梦CMS自带的编辑器又不直接支持优酷等视频网站的引用.所以为了方便教程的发布,特意在网 ...

  5. 微信qq,新浪等第三方授权登录的理解

    偶们常说的第三方是指的微信,qq,新浪这些第三方,因为现在基本每个人都有qq或者微信,那么我们就可以通过这些第三方进行登录.而这些网站比如慕课网是通过第三方获取用户的基本信息 它会有个勾选按钮,提示是 ...

  6. js 开发注意事项

    涉及api post 请求的, 涉及sqlite 存储的, conent 用encodeURIComponent, decodeURIComponent ,处理 JSON.parse 最好加上try ...

  7. Spring Cloud的DataRest(二)

    一.创建工程 1.主程序 2.依赖 3.配置 二.案例开发 1.entity 2.repository 三.案例验证 安装postman4.13,启动应用,执行如下案例验证! 1.create - p ...

  8. 新概念英语(1-a)句子集锦

  9. python利用文件对话框获取文件路径

    一.单文件 python3: import tkinter as tk from tkinter import filedialog root = tk.Tk() root.withdraw() fi ...

  10. JS中全等和相等操作符的区别和比较规则

    一.两者的区别 相等:先强制转换变量类型,再比较 全等:不转换类型,一旦类型不同,就是不全等. 二.相等和不相等的比较规则 1.操作符中有布尔值时: 比较前先将之转换为数值 false => 0 ...