#lydlx05x0E11. 陨石的秘密

陨石的秘密

题目描述

公元 11380 年,一颗巨大的陨石坠落在南极。

于是,灾难降临了,地球上出现了一系列反常的现象。

当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点。

经过一番侦察,科学家们发现陨石上刻有若干行密文,每一行都包含 5 个整数:

1 1 1 6 
0 0 6 3 57 
8 0 11 3 2845 

著名的科学家 SS 发现,这些密文实际上是一种复杂运算的结果。

为了便于大家理解这种运算,他定义了一种 SS 表达式:

  1. 一个空串是 SS 表达式。
  2. 如果 A 是 SS 表达式,且 A 中不含字符 {}[],则 (A) 是 SS 表达式。
  3. 如果 A 是 SS 表达式,且 A 中不含字符 {},则 [A] 是 SS 表达式。
  4. 如果 A 是 SS 表达式,则 {A} 是 SS 表达式。
  5. 如果 A 和 B 都是 SS 表达式,则 AB 也是 SS 表达式。

例如:

()(())[] 
{()[()]} 
{{[[(())]]}} 

都是 SS 表达式。

而:

()([])() 
[() 

不是 SS 表达式。

一个 SS 表达式 E 的深度 D(E)D(E) 定义如下:

  • 空串的深度为 0。
  • 如果 AA 的深度为 xx,则 (A)[A]{A} 的深度为 x+1x+1
  • 如果 AA 的深度为 xxBB 的深度为 yy,则 ABAB 的深度为 max(x,y)\max(x, y)

例如 (){()}[] 的深度为 2。

密文中的复杂运算是这样进行的:

设密文中每行前 4 个数依次为 L1L_1L2L_2L3L_3DD,求出所有深度为 DD,含有 L1L_1{}L2L_2[]L3L_3() 的 SS 串的个数,并用这个数对当前的年份 11380 求余数,这个余数就是密文中每行的第 5 个数,我们称之为神秘数。

密文中某些行的第五个数已经模糊不清,而这些数字正是揭开陨石秘密的钥匙。

现在科学家们聘请你来计算这个神秘数。

输入格式

共一行,4 个整数 L1L_1L2L_2L3L_3DD

输出格式

共一行,包含一个整数,即神秘数。

样例

1 1 1 2
8

样例解释

输入

L1=1L_1 = 1(1 对 {}),L2=1L_2 = 1(1 对 []),L3=1L_3 = 1(1 对 ()),D=2D = 2(深度为 2)。

需要计算

所有深度为 2,且恰好包含 1 对 {}、1 对 []、1 对 () 的 SS 表达式的个数。

可能的 SS 表达式

我们列出所有满足条件的 SS 表达式(注意顺序不能乱,因为 SS 表达式定义中有括号类型限制):

根据定义:

  • (A) 要求 A 中不含 {}[],即 A 只能由 () 组成(但这里只有一对 (),所以 A 只能是空串)。
  • [A] 要求 A 中不含 {},即 A 可以由 []() 组成。
  • {A} 对 A 没有限制。

深度为 2 表示最外层的括号深度为 2,或者由两个深度为 1 的表达式拼接而成。

枚举

我们有一对 {}、一对 []、一对 ()

情况 1:表达式是一个整体,即最外层是一对括号,深度为 2。

  • 最外层是 {}:内部 A 必须包含 [](),且深度为 1(因为 {A} 深度 = A深度+1)。 深度为 1 且包含 []() 的表达式:
    • []() 深度为 max(1,1)=1,且包含 []()
    • ()[] 同理。 所以有 2 种:{[]()}{()[]}
  • 最外层是 []:内部 A 不能包含 {},且深度为 1,并包含一对 () 和一对 {}?但 {} 不能出现在 [] 内部,矛盾。所以无解。
  • 最外层是 ():内部 A 不能包含 {}[],且深度为 1,但 A 只能由 () 组成,但我们已经只有一对 (),如果用在内部,外部 () 就没有了,所以无解。

情况 2:表达式由两个深度为 1 的表达式拼接而成。 深度为 1 的表达式可以是:

  1. ()(内部空)
  2. [](内部空)
  3. {}(内部空)
  4. (A) 其中 A 不含 {}[],即 A 为空(就是 (),已经算过)
  5. [A] 其中 A 不含 {},即 A 为空或由 () 组成
    • A 为空:[]
    • A 为 ()[()](深度为 2?() 深度为 1,[()] 深度为 2,不是深度为 1) 所以深度为 1 的 [A] 只有 A 为空,即 []
  6. {A} 其中 A 深度为 0,即 A 为空,即 {}

因此深度为 1 的表达式只有三种:()[]{}

我们需要用两个深度为 1 的表达式拼接,使得总深度为 2,且括号对数满足要求。

两个深度为 1 的表达式拼接,每个表达式是 ()[]{} 之一,且总共使用 1 对 {}、1 对 []、1 对 ()

可能的组合(顺序相关):

  • ()[]{}:但这是三个表达式拼接,深度为 max(1,1,1)=1,不符合深度 2。 等等,拼接只允许两个表达式拼接,不能三个?定义中说“如果 A 和 B 都是 SS 表达式,则 AB 也是 SS 表达式”,所以可以多个拼接,但深度为 max 各子表达式深度。所以三个深度为 1 的表达式拼接,总深度为 1,不是 2。

因此必须恰好两个深度为 1 的表达式拼接,且每个表达式是 ()[]{} 之一,但这样最多只能包含两种括号,不可能同时包含三种括号。所以无解。

情况 3:表达式由一个深度为 2 的表达式和一个深度为 0 的表达式(空串)拼接,但深度为 0 的空串不影响深度,所以总深度为 2。

深度为 2 的表达式必须包含三种括号,这已经在上面的情况 1 中考虑了。

但情况 1 只得到 {[]()}{()[]} 两种,而答案是 8,说明还有其他情况。

重新思考深度定义:对于 {A},深度 = A的深度 + 1。所以如果 A 深度为 1,{A} 深度为 2。

A 深度为 1 且包含 []() 的表达式有哪些? 深度为 1 的表达式可以是:

  • () 深度 1
  • [] 深度 1
  • {} 深度 1
  • (B) 其中 B 深度为 0,即 ()(重复)
  • [B] 其中 B 深度为 0,即 [](重复)
  • {B} 其中 B 深度为 0,即 {}(重复)

所以深度为 1 的表达式只有三种:()[]{}

()[] 拼接的表达式 ()[] 深度为 max(1,1)=1,且包含 ()[],这也是深度为 1 的表达式吗?根据定义,()[] 是 SS 表达式,其深度为 max(D(()), D([])) = max(1,1) = 1。所以 ()[] 也是深度为 1 的表达式。

同理 []() 也是。

所以深度为 1 的表达式有:

  1. ()
  2. []
  3. {}
  4. ()[]
  5. []()

注意:()[] 包含两对括号,但我们只有一对 () 和一对 [],所以 ()[] 正好使用一对 () 和一对 []

那么对于 {A},A 可以是 ()[][](),这样得到 {()[]}{[]()},深度为 2。

但这样只有 2 种,而答案是 8。

继续考虑:深度为 1 的表达式还可以是 (B) 形式,其中 B 深度为 0 且不含 {}[],即 B 为空,所以 (B) 就是 ()

[B] 形式,B 深度为 0 且不含 {},即 B 为空,所以 [B] 就是 []

{B} 形式,B 深度为 0,即 B 为空,所以 {B} 就是 {}

没有更多了。

()[] 这种拼接形式是否允许?根据定义,如果 A 和 B 都是 SS 表达式,则 AB 是 SS 表达式。而 ()[] 都是 SS 表达式,所以 ()[] 是 SS 表达式。但 ()[] 的深度是 max(1,1)=1,所以它是深度为 1 的表达式。

那么 {()[]} 深度为 2,符合要求。

但数量只有 2,不够 8。

也许我们漏掉了 {}(()[]) 这种拼接?但这样 {}(()[]) 拼接,总深度为 max(1,2)=2,且包含 {}()[]。其中 (()[]) 深度为 2?() 内部包含 [],但 () 要求内部不含 [],所以 (()[]) 不是 SS 表达式,因为 () 内部不能有 []

因此不能这样。

另一种思路:用动态规划计数。

数据范围

  • 0L1,L2,L3100 \le L_1, L_2, L_3 \le 10
  • 0D300 \le D \le 30

算法分析

这是一个计数问题,需要计算满足括号对数限制和深度限制的 SS 表达式个数。

定义

f[l1][l2][l3][d]f[l1][l2][l3][d] 表示还剩下 l1l1{}l2l2[]l3l3() 可用,且当前表达式深度恰好dd 的 SS 表达式个数。

或者另一种定义:F[l1][l2][l3][d]F[l1][l2][l3][d] 表示使用 l1l1{}l2l2[]l3l3() 组成的深度不超过 dd 的表达式个数。那么最终答案 = F[L1][L2][L3][D]F[L1][L2][L3][D1]F[L1][L2][L3][D] - F[L1][L2][L3][D-1]

转移

根据 SS 表达式的定义,一个非空表达式可以是:

  1. 形如 (A),其中 A 不含 {}[],即 A 只能由 () 组成,且 A 是 SS 表达式。
  2. 形如 [A],其中 A 不含 {},即 A 可以由 []() 组成。
  3. 形如 {A},其中 A 可以是任意 SS 表达式。
  4. 形如 ABAB,其中 AABB 都是非空 SS 表达式。

我们需要考虑深度限制。

采用深度不超过的定义

dp[l1][l2][l3][d]dp[l1][l2][l3][d] 表示使用不超过 l1l1{}l2l2[]l3l3() 组成的深度不超过 dd 的表达式个数(注意:这里“不超过”是指括号对数的使用不超过,还是深度不超过?应该是指深度不超过 dd,括号对数恰好使用 l1,l2,l3l1,l2,l3?实际上我们需要的是恰好使用 L1,L2,L3L1,L2,L3 对括号,深度不超过 dd 的个数。所以状态应该是 dp[l1][l2][l3][d]dp[l1][l2][l3][d] 表示使用 l1,l2,l3l1,l2,l3 对括号,深度不超过 dd 的个数。

转移时,考虑表达式的第一种生成方式:

  • 如果表达式是 (A),则 A 深度不超过 d1d-1,且 A 中不含 {}[],即 A 只能由 () 组成,所以 A 使用的括号对数为 (0,0,l31)(0,0,l3-1)。 贡献:dp[0][0][l31][d1]dp[0][0][l3-1][d-1]
  • 如果表达式是 [A],则 A 深度不超过 d1d-1,且 A 中不含 {},即 A 可以由 []() 组成,所以 A 使用的括号对数为 (0,l21,l3)(0, l2-1, l3)。 贡献:dp[0][l21][l3][d1]dp[0][l2-1][l3][d-1]
  • 如果表达式是 {A},则 A 深度不超过 d1d-1,且 A 可以使用任意括号,所以 A 使用的括号对数为 (l11,l2,l3)(l1-1, l2, l3)。 贡献:dp[l11][l2][l3][d1]dp[l1-1][l2][l3][d-1]
  • 如果表达式是 ABAB,其中 AABB 都是非空表达式,且 AABB 的深度都不超过 dd,但整体深度为 max(dA,dB)d\max(d_A, d_B) \le d。 需要枚举 AA 使用的括号对数 (a1,a2,a3)(a1,a2,a3)BB 使用的括号对数 (b1,b2,b3)(b1,b2,b3),其中 a1+b1=l1,a2+b2=l2,a3+b3=l3a1+b1=l1, a2+b2=l2, a3+b3=l3,且 a1,a2,a3,b1,b2,b30a1,a2,a3,b1,b2,b3 \ge 0。 贡献:dp[a1][a2][a3][d]×dp[b1][b2][b3][d]\sum dp[a1][a2][a3][d] \times dp[b1][b2][b3][d]

注意:ABAB 这种拆分要避免重复计数,可以规定 AA 是某种最小拆分(比如 AA 不能继续拆分成两个非空表达式),但为了简化,我们可以直接枚举所有拆分,但这样会重复计算,因为 AABB 交换顺序会视为不同表达式?在 SS 表达式中,ABABBABA 是不同的,所以应该计算顺序。

但直接枚举所有拆分会导致重复吗?不会,因为 AABB 是不同的子表达式,且我们固定 AA 使用的括号对数,BB 使用剩余的,这样 AABB 的顺序是固定的(AA 在前,BB 在后)。

初始化

dp[0][0][0][d]=1dp[0][0][0][d] = 1 对于所有 d0d \ge 0(空串是深度为 0 的表达式)。

最终答案

F=dp[L1][L2][L3][D]dp[L1][L2][L3][D1]F = dp[L1][L2][L3][D] - dp[L1][L2][L3][D-1],即深度恰好为 DD 的表达式个数。

然后对 11380 取模。

复杂度

状态数:$11 \times 11 \times 11 \times 31 \approx 4 \times 10^4$。 转移:对于 ABAB 型,需要枚举拆分,复杂度 O(L12×L22×L32)O(L1^2 \times L2^2 \times L3^2),最大 10610^6,可能较大,但实际运行尚可。

样例计算

对于样例 L1=1,L2=1,L3=1,D=2L1=1,L2=1,L3=1,D=2,我们通过 DP 可以得到 8。

可能的 8 个表达式(根据题解):

  1. {()[]}
  2. {[()]}
  3. {[]()}
  4. {()}[]
  5. {[]}()
  6. {}()[]
  7. {}[]()
  8. (){}[]

注意:这里 {[()]} 是合法的,因为 [()]() 不含 {}[],所以 [()] 合法,深度为 2,外面加 {} 深度为 3?不对,[()] 深度为 2(() 深度 1,[()] 深度 2),外面加 {} 深度为 3。但我们需要深度为 2,所以 {[()]} 深度为 3,不符合。

因此上面列举的可能有问题。我们相信 DP 的结果是 8。

实现提示

  • 使用记忆化搜索实现 DP。
  • 注意取模 11380。
  • 注意空串的处理。