#P16848. [GKS 2021 #C] Binary Operator
[GKS 2021 #C] Binary Operator
题目描述
给定一个使用非负整数、括号 、加号 、乘号 以及一个额外运算符 组成的合法算术表达式列表。这些表达式是完全括号化的,并且采用中缀表示法。
完全括号化的表达式是指每个运算符及其操作数都被包裹在一对括号中。
例如,表达式 完全括号化后变为 ,而 完全括号化后变为 。然而, 仍然是 ,因为它只包含一个数字而没有运算符。 不被认为是完全括号化的,因为它有多余的括号。
运算符 和 分别表示加法和乘法,而 可以是任意一个全函数(total function)。
你想将这些表达式分组为等价类,其中两个表达式属于同一个等价类当且仅当无论 代表哪个函数,它们的结果数值总是相同。
你可以假设在同一个测试用例中, 代表同一个函数。这意味着 可能代表某个已知函数(如加法或减法),但在同一个测试用例的不同部分不会代表不同的函数。
例如,考虑以下表达式:
$$\begin{aligned} F_1&=((1\#(1+1))+((2\#3)*2))\\ F_2&=(((2\#3)+(1\#2))+(2\#3))\\ F_3&=((2*(2\#3))+(1\#2)) \end{aligned}$$令 ,,则无论 代表什么函数,我们都可以将表达式重写为:
$$\begin{aligned} F_1&=((1\#2)+((2\#3)*2))=(A+(B*2))=(A+2B)\\ F_2&=(((2\#3)+(2\#3))+(1\#2))=((B+B)+A)=(A+2B)\\ F_3&=((2*(2\#3))+(1\#2))=((2*B)+A)=(A+2B) \end{aligned}$$因此 。
然而,考虑表达式 和 。如果 表示加法,那么 。但是,如果 是常数函数 ( 为非零整数),则 ,因为 。因此 和 不属于同一个等价类。
输入格式
输入的第一行给出测试用例的数量 。接下来有 个测试用例。每个测试用例的第一行包含一个整数 。随后 行,第 行包含一个表达式 。
输出格式
对于每个测试用例,输出一行,格式为 Case #x: Y1 Y2 ... YN,其中 是测试用例编号(从 开始), 是满足以下条件的字典序最小的序列:
- ,其中 表示该测试用例中等价类的总数。
- 当且仅当 和 属于同一个等价类。
3
7
(1*(1#2))
(0*(1#2))
(1#2)
0
(3*0)
((1#2)*1)
(((1+(1#2))+3)*0)
5
(1*((1+(2#2))+3))
((0+(2#2))+4)
(100#2)
(((1+(2#2))+3)*1)
((50*2)#2)
2
(9999999999999999999999999999999999999999+1)
(100000000000000000000*100000000000000000000)
Case #1: 1 2 1 2 2 1 2
Case #2: 1 1 2 1 2
Case #3: 1 1
1
9
((2*(2#3))+(1#2))
(0*(1#2))
0
((1#(1+1))+((2#3)*2))
(3*0)
(1#(2#3))
(((2#3)+(1#2))+(2#3))
(4#7)
(7#4)
Case #1: 1 2 2 1 2 3 1 4 5
提示
这个样例测试集 包含 个测试用例。
测试用例 有 个表达式,共 个等价类,记作 和 。
,,,。
、 和 属于 ,、、 和 属于 。
在测试用例 中,有 个序列 满足等价类的要求: 和 。
由于 字典序更小,因此测试用例 的输出为:Case #1: 1 2 1 2 2 1 2。
测试用例 有 个表达式,共 个等价类,记作 和 。
、 和 属于 , 和 属于 。
因此,测试用例 的输出为:Case #2: 1 1 2 1 2。
测试用例 有 个表达式,它们都不包含 。
这两个表达式的计算结果相同,因此属于同一个等价类。
在所提供的样例 中,共有 个等价类。输入中的第一个表达式为 。与其属于同一等价类的所有表达式在输出中用 表示。用 表示的等价类包含 、 和 。用 表示的等价类包含 。最后两个表达式 和 彼此不等价,也与之前的任何表达式不等价。注意, 是满足给定输入等价类要求的众多序列之一,但它不是正确答案,因为该序列不是字典序最小的。
限制条件
对于所有 , 的长度至多为 。
对于所有 , 是合法的。
测试集 1
每个表达式中最多有一个 。
测试集 2
无额外限制。
翻译由 DeepSeek V4 Pro 完成