QOJ.ac

QOJ

Time Limit: 2.0 s Memory Limit: 256 MB Total points: 100 Hackable ✓

#15856. LCG Manipulation

统计

线性同余生成器(LCG)是一种产生伪随机数无限序列的过程。许多电子游戏使用该过程来快速生成一系列用于各种非确定性过程的“足够好”的随机数。

例如,考虑宝可梦系列游戏。每当你捕捉到一只新的宝可梦时,它的六项属性值都会获得一个从 $+0$ 到 $+31$ “均匀随机”选择的整数加成。其目的是模拟每只宝可梦如何拥有不同于同物种其他个体的独特优缺点。这些属性加成由 LCG 的输出决定。

竞技玩家需要他们的队伍处于巅峰状态。然而,六项属性全部获得完美 $+31$ 的概率是 $1/2^{30}$,即不到十亿分之一。但如果我告诉你,不知何故,一位知识渊博的玩家可以在寥寥几次尝试中“奇迹般地”获得属性完美的宝可梦,你会怎么想?

事实上,在许多游戏中,可以通过操纵看似随机的游戏内事件来始终产生最优结果。怎么做到的!?好吧,让我们深入了解一下 LCG 的工作原理……

LCG 生成一个无限序列 $x_0, x_1, x_2, x_3, \dots$,该序列由四个值决定:非负整数 $a, b, s$ 和 $p$。令 $x_0 = s$(这就是为什么 $s$ 通常被称为“种子”)。对于每个 $n \ge 1$,序列的下一项定义为:

$$x_n = (ax_{n-1} + b) \pmod p$$

通常情况下,模数可以是任何数字,但对于本题,我们使用字母 $p$,因为我们只考虑模数为素数的情况。

LCG 看起来似乎是随机的,但它实际上非常可预测!如果你能揭示 $a, b, s$ 和 $p$ 的值,并且知道当 LCG 生成值 $v$ 时会出现最优结果,那么你就可以使用计算机程序准确计算出需要等待多久,游戏才会进入所需的“随机”状态。

我想你现在已经猜到题目要求了。你需要进行一次“不可思议的机会概率计算”。给定 $a, b, s, p$ 和某个值 $v$,求出满足 $x_n = v$ 的最小非负整数 $n$;如果不存在这样的 $n$,则报告该情况。此外,每个文件中会有 $T$ 组独立的测试用例。

输入格式

输入的第一行包含一个正整数 $T$,表示测试用例的数量。

接下来有 $T$ 行,每行包含五个空格分隔的整数 $a, b, s, p$ 和 $v$。

数据范围

  • $1 \le T \le 40$
  • $2^3 - 1 \le p \le 2^{31} - 1$
  • $p$ 是素数
  • $0 < a, b < p$
  • $0 \le s, v < p$

输出格式

对于每个测试用例,输出一行:

  • 如果存在 $n$ 使得 $x_n = v$,则输出满足条件的最小 $n$
  • 否则,输出单词 IMPOSSIBLE

样例

输入 1

8
2 3 1 7 5
2 3 1 7 6
2 3 1 7 1
2 3 1 7 0
7 1 2 31 24
7 1 2 31 25
7 1 2 31 26
7 1 1 31 26

输出 1

1
2
0
IMPOSSIBLE
6
4
IMPOSSIBLE
2

输入 2

2
314159265 1234567890 2022 2147483647 2023
1234567890 314159265 2022 2147483647 2023

输出 2

1058977885
IMPOSSIBLE

说明

假设 $(a, b, s, p) = (7, 1, 2, 31)$。 那么,$x_0 = 2$ 且 $x_n = (7x_{n-1} + 1) \pmod{31}$。

  • $x_1 = (7 \times 2 + 1) \pmod{31} = 15$。
  • $x_2 = (7 \times 15 + 1) \pmod{31} = 13$。
  • $x_3 = (7 \times 13 + 1) \pmod{31} = 30$。
  • $x_4 = (7 \times 30 + 1) \pmod{31} = 25$。
  • $x_5 = (7 \times 25 + 1) \pmod{31} = 21$。
  • $x_6 = (7 \times 21 + 1) \pmod{31} = 24$。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.