#P1182. 口令循环节

    ID: 194 传统题 1000ms 128MiB 尝试: 0 已通过: 0难度: 提高 ← 上一题 下一题 → 随机一题 上传者: 标签 数论 欧拉定理 快速幂 数学
显示设置

口令循环节

题目背景

试验场的密码锁每天换一次口令。管理员只记得卡片上的两个数字:底数 aa 和模数 mm。锁里的寄存器每按一次按钮就做一次「乘 aa 再对 mm 取余」,一旦寄存器回到 11,整台锁就会自动重置。管理员想知道,自己最多要按多少次按钮才会看到重置。

题目描述

给定两个正整数 aa 与 mm,满足 a<ma < m。请求出最小的正整数 tt,使得

at≡1(modm).a^{t} \equiv 1 \pmod m .

如果不存在这样的正整数 tt,请输出 -1。

输入格式

一行两个整数 a,ma, m。

输出格式

一行一个整数,表示最小的 tt,或者 -1。

输入输出样例 #1

输入 #1

3 7

输出 #1

6

输入输出样例 #2

输入 #2

2 9

输出 #2

6

输入输出样例 #3

输入 #3

6 9

输出 #3

-1

输入输出样例 #4

输入 #4

1 5

输出 #4

1

说明

样例解释

样例 1 中,3,9,27,81,2433,9,27,81,243 除以 77 的余数依次是 3,2,6,4,53,2,6,4,5,都不到 11;36=729=104×7+13^6 = 729 = 104 \times 7 + 1,所以最小的 tt 是 66。

样例 2 中,22 的幂除以 99 的余数依次为 2,4,8,7,5,12,4,8,7,5,1,第六次回到 11,因此 t=6t = 6。

样例 3 中,66 与 99 的最大公约数是 33,凡是 66 的幂都能被 33 整除,不可能除以 99 余 11,所以输出 -1。

样例 4 中 a=1a = 1,第一次乘完寄存器就已经是 11,t=1t = 1。

数据范围

  • 对于 25%25\% 的数据,m≤400m \le 400;
  • 对于 60%60\% 的数据,m≤106m \le 10^6;
  • 对于 100%100\% 的数据,1≤a<m≤10121 \le a < m \le 10^{12}。