Description

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

  1. 给定 \(y,z,p\),计算 \(y^z \bmod p\) 的值;
  2. 给定 \(y,z,p\),计算满足 \(xy≡ z \pmod p\) 的最小非负整数;
  3. 给定 \(y,z,p\),计算满足 \(y^x ≡ z \pmod p\) 的最小非负整数。

Input

输入包含多组数据。

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

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

Output

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

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

Sample Input

3 1
2 1 3
2 2 3
2 3 3
3 2
2 1 3
2 2 3
2 3 3

Sample Output

2
1
2
2
1
0

HINT

\(1\le y,z,p\le 10^9\),\(p\)为质数,\(1\le T\le10\)

Solution

询问 \(2\)

\[ax\equiv b\pmod p\\
\Downarrow\\
ax-kp=b
\]

该方程有解的充要条件为 \(\gcd(a,p)\mid b\),答案为 \(b\times a^{-1}\bmod p\)。

询问 \(3\)

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

\[a^x\equiv b\pmod p
\]

根据费马小定理可知

\[a^x\equiv a^{x \bmod p-1}\pmod p
\]

因此 \(x\) 从 \(0\) 枚举到 \(p-2\) 即可。

设 \(m={\left\lceil\sqrt p\right\rceil},x=i\times m-j\),有

\[a^{i\times m-j}\equiv b\pmod p
\]

移项得

\[(a^m)^i\equiv a^jb\pmod p
\]

首先从 \(0\dots m\) 枚举 \(j\),将得到的 \(a^jb\) 的值存入 \(hash\) 表中,然后从 \(1\dots m\) 枚举 \(i\),若表中存在 \((a^m)^i\),则当前 \(i\times m-j\) 即为答案。

Code

#include <cmath>
#include <cstdio>
#include <tr1/unordered_map> std::tr1::unordered_map<int,int> hash; int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int fastpow(int a, int b, int p) {
int res = 1;
for (; b; b >>= 1, a = 1LL * a * a % p)
if (b & 1) res = 1LL * res * a % p;
return res;
}
void bsgs(int a, int b, int p) {
if (a % p == 0) { puts("Orz, I cannot find x!"); return; }
int m = ceil(sqrt(p)), t = 1;
hash.clear(), hash[b % p] = 0;
for (int i = 1; i <= m; ++i)
t = 1LL * t * a % p, hash[1LL * t * b % p] = i;
a = t;
for (int i = 1; i <= m; ++i, t = 1LL * t * a % p)
if (hash.count(t)) { printf("%d\n", i * m - hash[t]); return; }
puts("Orz, I cannot find x!");
}
int main() {
int T = read(), K = read();
while (T--) {
int a = read(), b = read(), p = read();
if (K == 1) printf("%d\n", fastpow(a, b, p));
else if (K == 2) {
if (b % gcd(a, p)) puts("Orz, I cannot find x!");
else printf("%lld\n", 1LL * b * fastpow(a, p - 2, p) % p);
} else bsgs(a, b, p);
}
return 0;
}

[BZOJ 2242] [SDOI 2011] 计算器的更多相关文章

  1. 【BZOJ 2242】[SDOI2011]计算器

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

  2. [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】

    题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...

  3. [SDOI 2011]计算器

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

  4. BZOJ 2243 SDOI 2011染色

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 算法讨论: 树链剖分把树放到线段树上.然后线段树的每个节点要维护的东西有左端点的颜色 ...

  5. [BZOJ 2285] [SDOI 2011] 保密

    Description 传送门 Solution 这道题的最大难点在于读懂题意(雾 分数规划求出 \(n\) 到 \(1\cdots n_1\) 每个点的最小 \(\sum\frac{t_i}{s_i ...

  6. BZOJ 2245 SDOI 2011 工作安排 费用流

    题目大意:有一些商品须要被制造.有一些员工.每个员工会做一些物品,然而这些员工做物品越多,他们的愤慨值越大,这满足一个分段函数.给出哪些员工能够做哪些东西,给出这些分段函数,求最小的愤慨值以满足须要被 ...

  7. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  8. [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

    [BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...

  9. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

随机推荐

  1. 如何解决升级到Dynamics 365后有很多的Sandbox的WorkerProcess并导致异常?

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复254或者20170505可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  2. .Net Core + Angular Cli / Angular4 开发环境搭建

    一.基础环境配置 1.安装VS 2017 v15.3或以上版本 2.安装VS Code最新版本 3.安装Node.js v6.9以上版本 4.重置全局npm源,修正为 淘宝的 NPM 镜像: npm  ...

  3. Centos7VMware虚拟机最小化安装后,安装Tenda U12 USB无线网卡驱动

    前几天买下了Tenda U12 USB 无线网卡 ,想连接上无线玩玩,可惜买下折腾了一周才解决他它驱动问题,前后在VMware上装了十多次,测试了好几个内核版本才搞定,好了废话不多说,分享下我安装过程 ...

  4. SQLServer删除数据列

    删除数据列 开发或者生产过程中多建.错误或者重复的数据列需要进行删除操作. 使用SSMS数据库管理工具删除数据列 方式一 1.打开数据库->选择数据表->展开数据表->展开数据列-& ...

  5. Elixir 简介

    概述 Elixir 是一种基于 Erlang 虚拟机的函数式,面向并行的通用语言, 它是一门通用语言,所以不仅可以用在擅长的高可用,高并发场景下,也可以用在 web 开发等场景下. Erlang 诞生 ...

  6. B

    baababblebabblerbabebabelbaboonbabybabyhoodBabylonBabylonianbacchanalbacchanalianbachelorbacillusbac ...

  7. day18-网络编程基础(一)

    勿骄勿燥,还是要定下心学习,还有有些没定下心 1.基础知识 2.tcp与udp协议 3.网络套接字 4.基于c/s结构的服务器客户端的实验 开始今日份总结 1.基础知识 现有的软件,绝大多数是基于C/ ...

  8. CF786B Legacy(线段树优化建图)

    嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...

  9. day 9~11 函数

    今日内容 '''函数四个组成部分函数名:保存的是函数的地址,是调用函数的依据函数体:就是执行特定功能的代码块函数返回值:代码块执行的结果反馈函数参数:完成功能需要的条件信息​1.函数的概念2.函数的定 ...

  10. 压力测试Apache

    在做类似商城秒杀系统的同事都知道要在支持高并发,高可用的环境下进行多次的压力测试来防止自己的项目结构被高额的点击量击穿,导致商品超卖等损失 介绍一款简单的软件 xampp xam里带了Apache服务 ...