QOJ.ac

QOJ

时间限制: 90 s 内存限制: 1024 MB 总分: 42

#12441. 十六进制硬币大作战

统计

Code Jam 团队的第一种加密货币 jamcoins 从未流行起来。今年,我们再次尝试推出 hexacoins,其名称源于它们对 16 进制的使用。要“挖掘”一个 $D$ 位的 hexacoin,需要处理使用恰好 $D$ 个 16 进制位(包括必要的前导零)的整数。每个值代表一个 $0$ 到 $16^D - 1$(含)之间的整数。16 进制位通常用数字 $0$ 到 $9$ 和大写字母 $A$ 到 $F$ 表示。例如,当 $D=3$ 时,F2B、0C8 和 000 是有效值,分别对应 10 进制值 3883、200 和 0。另一方面,当 $D=3$ 时,1234、DF、C0DE 和 JAM 不是有效值。

在对 $D$ 位 16 进制值进行加法运算时,任何溢出的位都会被丢弃。也就是说,加法是在模 $16^D$ 下进行的。例如,F2B + 0C8 = FF3(10 进制为 4083),而 F2B + F2B = E56(10 进制为 3670,因为求和结果为 7766,取模 $16^3$ 后得到 3670)。

要“挖掘”一个 $D$ 位的 hexacoin,计算机必须执行以下步骤:

  1. 选择一个包含 $N$ 个 $D$ 位 16 进制值的列表 $L = [L_1, L_2, \dots, L_N]$。
  2. 选择一个 $D$ 位 16 进制值的目标范围:从 $S$ 到 $E$(含)之间的数字。
  3. 从所有 $16!$ 种排列中均匀随机选择一个 16 进制位($0$ 到 $F$)的排列 $P$。
  4. 将 $P$ 应用于列表中所有数字的所有位,创建一个包含 $N$ 个 $D$ 位 16 进制值的新列表 $L'$。形式上,$L'$ 中第 $i$ 个元素的第 $j$ 位是将 $P$ 应用于 $L$ 中第 $i$ 个元素的第 $j$ 位的结果。
  5. 从 $L'$ 中不放回地均匀随机选择一对元素,该选择独立于排列的选择。
  6. 计算所选两个元素的和(丢弃溢出位)。

如果最后一步计算出的和在 $S$ 到 $E$(含)之间,则表示找到了一个 hexacoin!例如,假设: $L = [134, 000, FFB, 000, AA9]$。 $S = 85C$ 且 $E = EDF$。 * 计算机恰好选择了 $P = (0 \to 4, 1 \to A, 2 \to 2, 3 \to 8, 4 \to 9, 5 \to B, 6 \to C, 7 \to 7, 8 \to F, 9 \to 1, A \to 0, B \to 3, C \to 5, D \to 6, E \to E, F \to D)$。

那么,当 $P$ 应用于 $L$ 时,得到的 $L'$ 为 $[A89, 444, DD3, 444, 001]$。注意 $P$ 不应用于 $S$ 和 $E$。

共有 $(5 \times 4) / 2 = 10$ 对值可供选择,每一对被选中的概率为 $1/10$。落在范围内的和只有 A89 + DD3 = 85C, 444 + 444 = 888, A89 + 001 = A8A, DD3 + 001 = DD4, 以及 A89 + 444 = ECD(两次)。

前两个步骤已经完成,你知道所选的列表 $L$ 和范围 $[S, E]$。在执行剩余过程后,找到 hexacoin 的概率是多少?

输入格式

输入的第一行包含测试用例的数量 $T$。接下来是 $T$ 个测试用例。每个测试用例包含三行。第一行包含两个整数 $N$ 和 $D$:给定列表的大小和要处理的位数。第二行包含两个 $D$ 位 16 进制数 $S$ 和 $E$:目标范围的包含性下界和上界。接下来还有一行,包含 $N$ 个 $D$ 位 16 进制数 $L_1, L_2, \dots, L_N$,表示列表中的值。

输出格式

对于每个测试用例,输出一行 Case #x: y z,其中 $x$ 是测试用例编号(从 1 开始),$y$ 和 $z$ 是非负整数,使得分数 $y/z$ 表示在上述条件下找到 hexacoin 的概率。$x, y, z$ 均必须以 10 进制表示。如果 $y$ 和 $z$ 有多个可接受的值,请选择使得 $z$ 最小的一组。

数据范围

时间限制:每个测试集 90 秒。 内存限制:1GB。 $2 \le N \le 450$。 $S$ 恰好包含 $D$ 个字符。 $S$ 的每个字符都是一个 16 进制位。 $E$ 恰好包含 $D$ 个字符。 $E$ 的每个字符都是一个 16 进制位。 $S \le E$。 对于所有 $i$,$L_i$ 恰好包含 $D$ 个字符。 对于所有 $i$,$L_i$ 的每个字符都是一个 16 进制位。

子任务

测试集 1(可见判定) $1 \le T \le 100$ $2 \le D \le 3$

测试集 2(隐藏判定) $1 \le T \le 100$ $2 \le D \le 4$

测试集 3(隐藏判定) $1 \le T \le 10$ $2 \le D \le 5$

样例

样例输入 1

4
2 2
10 10
00 FF
2 2
10 11
00 FF
4 3
FFF FFF
230 A10 010 F70
4 3
AFF FFF
230 A10 010 F70

样例输出 1

Case #1: 7 120
Case #2: 1 15
Case #3: 0 1
Case #4: 2731 8736

说明

在样例 1 中,目标范围仅为一个值 10。由于结果以 0 结尾,分配给最后两位 0 和 F 的值的和也必须以 0 结尾。由于 $P[0]$ 和 $P[F]$ 是不同的值,它们的和不可能是 0。因此,$P[0] + P[F]$ 必须是 10(16 进制)。有 7 对不同的数字可以实现这一点。$P[0]$ 和 $P[F]$ 不能同时为 8。所有 7 对数字都会导致总和为 10(在丢弃溢出的 1 之后)。因此,有 14 种将不同数字分配给 0 和 F 的方式可以得到 hexacoin。对于这些数字,有 $16 \times 15$ 种可能的分配方式,因此结果为 $14/240 = 7/120$。

在样例 2 中,我们需要将结果恰好为 11 的概率加到样例 1 的结果中。唯一能实现这一点的情况是 0 和 F 被分配为 0 和 1(顺序不限)。这种情况的概率为 $2/240 = 1/120$,从而得到总概率 $7/120 + 1/120 = 8/120 = 1/15$。

在样例 3 中,请注意无论计算机从列表中选择哪种排列和哪对数字,我们相加的两个数字的末位都相同。这会产生一个偶数结果,即使在模 $16^3$ 之后也是如此。由于范围内的唯一值是奇数,我们在这个案例中没有希望挖掘到 hexacoin。注意 0 2 是无效的答案表示,因为 $z$ 不是最小的。

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.