#P12728. [GCJ 2020 Finals] Hexacoin Jam

[GCJ 2020 Finals] Hexacoin Jam

题目描述

Code Jam 团队的第一种加密货币 jamcoins 从未流行起来。今年,我们尝试推出基于 16 进制的 十六进制币hexacoinshexacoins)。要“挖矿”一个 D\mathbf{D} 位十六进制币,需要处理恰好 D\mathbf{D} 位的 16 进制数(必要时包含前导零)。每个数值代表 0016D116^{\mathbf{D}} - 1(含)之间的整数。16 进制数字由数字 0 到 9 和大写字母 A 到 F 表示。例如,当 D=3\mathbf{D}=3 时,F2B、0C8 和 000 是有效值,对应十进制值 3883、200 和 0。而 1234、DF、C0DE 和 JAM 不是 D=3\mathbf{D}=3 时的有效值。

执行 D\mathbf{D} 位 16 进制数加法时,溢出的位数会被丢弃(即模 16D16^{\mathbf{D}} 加法)。例如,F2B + 0C8 = FF3(十进制 4083),F2B + F2B = E56(十进制 3670,因为和为 7766,模 16316^3 得 3670)。

要“挖矿”一个 D\mathbf{D} 位十六进制币,计算机需执行以下步骤:

  1. 选择一个包含 N\mathbf{N}D\mathbf{D} 位 16 进制数的列表 L\mathbf{L}:$\mathbf{L}_1, \mathbf{L}_2, ..., \mathbf{L}_\mathbf{N}$。
  2. 选择一个目标范围 S\mathbf{S}E\mathbf{E}(含)的 D\mathbf{D} 位 16 进制数。
  3. 从所有 16! 种排列中均匀随机选择一个 16 进制数字 0 到 F 的排列 P\mathbf{P}
  4. P\mathbf{P} 应用于 L\mathbf{L} 中所有数字的每一位,生成新列表 L\mathbf{L}'。形式化地,L\mathbf{L}' 的第 ii 个元素的第 jj 位是 P\mathbf{P} 作用于 L\mathbf{L} 的第 ii 个元素的第 jj 位的结果。
  5. L\mathbf{L}' 中均匀随机且独立地选择一对元素(无放回)。
  6. 计算所选两个元素的和(丢弃溢出位)。

如果最后一步的和在 S\mathbf{S}E\mathbf{E}(含)之间,则成功挖到一枚十六进制币!例如:

  • L=[134,000,FFB,000,AA9]\mathbf{L} = [134, 000, FFB, 000, AA9]
  • S=85C\mathbf{S} = 85CE=EDF\mathbf{E} = EDF
  • 计算机选择排列 $\mathbf{P} = (0 \rightarrow 4, 1 \rightarrow A, 2 \rightarrow 2, 3 \rightarrow 8, 4 \rightarrow 9, 5 \rightarrow B, 6 \rightarrow C, 7 \rightarrow 7, 8 \rightarrow F, 9 \rightarrow 1, A \rightarrow 0, B \rightarrow 3, C \rightarrow 5, D \rightarrow 6, E \rightarrow E, F \rightarrow D)$。

应用 P\mathbf{P} 后,L=[A89,444,DD3,444,001]\mathbf{L}' = [A89, 444, DD3, 444, 001]。注意 S\mathbf{S}E\mathbf{E} 不受 P\mathbf{P} 影响。

共有 (5×4)/2=10(5 \times 4) / 2 = 10 对可选,每对概率为 1/101/10。满足范围的求和结果为:A89 + DD3 = 85C、444 + 444 = 888、A89 + 001 = A8A、DD3 + 001 = DD4 和 A89 + 444 = ECD(两次)。

已知前两步的 L\mathbf{L} 和范围 [S,E][\mathbf{S}, \mathbf{E}],求后续步骤成功挖矿的概率。

输入格式

第一行输入测试用例数 T\mathbf{T}。随后每个测试用例包含三行:
第一行两个整数 N\mathbf{N}D\mathbf{D}:列表大小和数字位数。
第二行两个 D\mathbf{D} 位 16 进制数 S\mathbf{S}E\mathbf{E}:目标范围的上下界。
第三行 N\mathbf{N}D\mathbf{D} 位 16 进制数 $\mathbf{L}_1, \mathbf{L}_2, \dots, \mathbf{L}_\mathbf{N}$。

输出格式

对每个测试用例,输出一行 Case #x: y z,其中 xx 为测试用例编号(从 1 开始),yyzz 为非负整数,表示概率的最简分数 y/zy/z。若存在多解,取 zz 最小者。

输入输出样例 #1

输入 #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 中,目标范围仅为 1010。由于结果末位需为 00,且 P[0]\mathbf{P}[0]P[F]\mathbf{P}[F] 不同,它们的和必须为 1010(16 进制)。共有 7 对不同的数字满足此条件(不能同为 8),对应 14 种赋值方式。总可能赋值数为 16×15=24016 \times 15 = 240,故概率为 14/240=7/12014/240 = 7/120

样例 #2 需额外考虑和为 1111 的情况,仅当 00FF 被赋值为 0011(顺序不限)时成立,概率为 2/2402/240。总概率为 7/120+1/120=1/157/120 + 1/120 = 1/15

样例 #3 中,无论选择哪对数字,和的末位均为偶数,而目标范围 FFFFFF 为奇数,故概率为 00。注意 0/20/2 不是合法输出,因为 zz 未取最小。

数据范围

  • 2N4502 \leq \mathbf{N} \leq 450
  • S\mathbf{S}E\mathbf{E} 均为 D\mathbf{D} 位 16 进制数,且 SE\mathbf{S} \leq \mathbf{E}
  • 每个 Li\mathbf{L}_iD\mathbf{D} 位 16 进制数。

测试集 1(10 分,可见判定)

  • 1T1001 \leq \mathbf{T} \leq 100
  • 2D32 \leq \mathbf{D} \leq 3

测试集 2(10 分,隐藏判定)

  • 1T1001 \leq \mathbf{T} \leq 100
  • 2D42 \leq \mathbf{D} \leq 4

测试集 3(22 分,隐藏判定)

  • 1T101 \leq \mathbf{T} \leq 10
  • 2D52 \leq \mathbf{D} \leq 5