#tYybttg060406. 1636:【例 6】计算器

1636:【例 6】计算器

1636:【例 6】计算器

题目描述

原题来自:SDOI 2011

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

  1. 给定 y,z,py, z, p,计算 yzmodpy^z \bmod p 的值;
  2. 给定 y,z,py, z, p,计算满足 x×yz(modp)x \times y \equiv z \pmod{p} 的最小非负整数 xx
  3. 给定 y,z,py, z, p,计算满足 yxz(modp)y^x \equiv z \pmod{p} 的最小非负整数 xx

输入格式

输入包含多组数据。

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

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

输出格式

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

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

样例

样例输入 #1(询问类型 1)

3 1
2 1 3
2 2 3
2 3 3

样例输出 #1

2
1
2

样例解释 #1

  • 类型 1:计算 yzmodpy^z \bmod p
  • 第一组:21mod3=22^1 \bmod 3 = 2
  • 第二组:22mod3=4mod3=12^2 \bmod 3 = 4 \bmod 3 = 1
  • 第三组:23mod3=8mod3=22^3 \bmod 3 = 8 \bmod 3 = 2

样例输入 #2(询问类型 2)

3 2
2 1 3
2 2 3
2 3 3

样例输出 #2

2
1
0

样例解释 #2

  • 类型 2:解方程 x×yz(modp)x \times y \equiv z \pmod{p}
  • 第一组:x×21(mod3)x \times 2 \equiv 1 \pmod{3},解为 x=2x=2(因为 2×2=41(mod3)2 \times 2 = 4 \equiv 1 \pmod{3})。
  • 第二组:x×22(mod3)x \times 2 \equiv 2 \pmod{3},解为 x=1x=11×2=21 \times 2 = 2)。
  • 第三组:x×23(mod3)x \times 2 \equiv 3 \pmod{3},注意 3mod3=03 \bmod 3 = 0,所以方程是 2x0(mod3)2x \equiv 0 \pmod{3},解为 x=0x=0(因为 2×0=02 \times 0 = 0)。注意 xx 可以取 00,且 00 是最小非负整数解。

数据范围与提示

对于全部数据:

  • 1y,z,p1091 \le y, z, p \le 10^9
  • 1T101 \le T \le 10
  • 保证 pp 为质数

时空限制

  • 时间限制:1000 ms
  • 内存限制:524288 KB

注意:本题三个子任务分别对应:

  1. 快速幂取模。
  2. 线性同余方程(求逆元)。
  3. 离散对数(BSGS算法)。

由于 pp 是质数,求解较为方便。

任务 1:直接用快速幂计算 yzmodpy^z \bmod p

任务 2:方程 x×yz(modp)x \times y \equiv z \pmod{p}。如果 y0(modp)y \equiv 0 \pmod{p},则方程化为 0z(modp)0 \equiv z \pmod{p},如果 z0z \equiv 0,则 xx 可取任意整数,最小非负整数解为 00;否则无解。如果 y≢0(modp)y \not\equiv 0 \pmod{p},由于 pp 是质数,yy 有逆元,xz×y1(modp)x \equiv z \times y^{-1} \pmod{p},用扩展欧几里得或费马小定理求逆元(因为 pp 是质数,yp2modpy^{p-2} \bmod p 就是逆元)。注意求最小非负整数解。

任务 3:离散对数问题 yxz(modp)y^x \equiv z \pmod{p},用 BSGS算法(Baby-Step Giant-Step)。由于 pp 是质数,且 p109p \le 10^9,但 T10T \le 10,可以使用 BSGS。注意特判:

  • 如果 y0(modp)y \equiv 0 \pmod{p},则 yx0y^x \equiv 0,如果 z0z \equiv 0x=1x=1(因为 01=00^1=0),但 x=0x=0y0=1y^0=1(如果 y=0y=0000^0 未定义,通常不考虑)。实际上,y=0y=0 时,x>0x>0yx=0y^x=0,所以如果 z=0z=0y=0y=0,则 xx 最小为 11(如果 z0z \neq 0 则无解)。
  • 如果 z1(modp)z \equiv 1 \pmod{p},则 x=0x=0 是解(因为 y0=1y^0=1)。
  • 一般情况,BSGS 算法步骤:
    1. m=pm = \lceil \sqrt{p} \rceil
    2. 预处理 y0,y1,,ym1y^{0}, y^{1}, \dots, y^{m-1}pp 的值,存入哈希表(或有序表)。
    3. 计算 ymy^{-m}(即 ymy^{m} 的逆元)。
    4. t=zt = z,对于 ii00m1m-1,检查 tt 是否在哈希表中,如果在,则找到解 x=i×m+jx = i \times m + j(其中 jj 是对应的指数)。否则令 t=t×ymmodpt = t \times y^{-m} \bmod p
    5. 如果找不到,则无解。

注意 BSGS 算法中 yypp 不一定互质,但 pp 是质数且 y0(modp)y \neq 0 \pmod{p} 时它们互质,可以求逆元。如果 y0(modp)y \equiv 0 \pmod{p},已经特判。

由于 p109p \le 10^9m31623m \approx 31623,哈希表大小可行。注意使用 unordered_map 或手写哈希以提高速度。