小蓝定义的数列生成规则为:从 x=1 开始,反复将 x 更新为 (x×p)modq。由于 x 的取值只有 0 到 q−1 这 q 种可能,整个序列在更新足够多次后必然会进入循环。题目要求“无限次操作中一共会产生多少个不同的 x 值”,这等价于从初始值 1 开始,沿着更新规则一直走,直到第一次遇到之前出现过的值为止,其间访问过的不同值的个数。
具体模拟过程如下:
visited(或等效的标记结构),用于记录某个值是否已经被访问过。visited 中:小蓝定义了一个数列生成规则:给定一个乘数 p 和一个上限 q,从 x=1 开始,反复将 x 更新为 (x×p)modq。由于可能的取值有限,这个过程最终会进入循环。请你计算在无限次操作中,一共会产生多少个不同的 x 值。
约束:p 的范围是 0≤p≤106,q 的范围是 1≤q≤106。
输入包含一行,包含两个整数 p 和 q(0≤p≤106,1≤q≤106),分别表示乘数和上限。
输出一个整数,表示能得到的不同的 x 值的个数。
输入
3 10
输出
4
说明
从 x=1 开始,按规则依次计算:1→3→9→7→1。
得到的不同值有 1、3、9、7,后续不再产生新值,因此总共有 4 个不同值。
输入
0 5
输出
2
说明
当 p=0 时,对任意 x 都有 (x×0)modq=0。
从 1 开始,第一次更新得到 0,之后永远停留在 0。
因此产生的不同值只有 1 和 0,共 2 个。
输入
6 9
输出
3
说明
序列更新过程:1×6mod9=6,6×6mod9=0,0×6mod9=0。
依次出现的值为 1、6、0,之后不再产生新值,不同值总数为 3。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册