题目描述
有一个 行 列的字符网格,每个格子里写着一个左括号 ( 或右括号 )。
小 Z 从左上角 出发,每次只能向右或向下移动一格,最终到达右下角 。他按经过格子的先后顺序依次记录每个格子中的括号,得到一个长度为 的括号序列。如果这个序列是合法括号序列,就称对应的移动路径为合法路径。
一个括号序列合法,当且仅当:
- 任意前缀中,左括号数量都不少于右括号数量;
- 整个序列中,左括号数量等于右括号数量。
请求出从 到 的合法路径数量。两条路径不同,当且仅当它们至少有一步的移动方向不同。
由于答案可能很大,请输出答案对 取模后的结果。
输入格式
第一行包含两个正整数 。
接下来 行,每行包含一个长度为 、仅由 ( 和 ) 组成的字符串,表示括号网格。
输出格式
输出一个整数,表示合法路径数量对 取模后的结果。
样例
输入
2 3 (() ())
输出
3
输入
2 2 (( ))
输出
0
提示说明
【样例解释】
- 样例 1:从 到 共有三条路径(右右下、右下右、下右右),三条路径得到的括号序列均为
(()),因此答案为 。 - 样例 2:任意路径都经过 个格子,长度为奇数的括号序列不可能合法,因此答案为 。
【数据规模与约定】
对于全部数据:。
| 子任务 | 测试点 | 分值 | 限制 |
|---|---|---|---|
| S1 | 1~2 | 10 | |
| S2 | 3~5 | 15 | 或 |
| S3 | 6~10 | 25 | |
| S4 | 11~14 | 20 | |
| S5 | 15~20 | 30 | 无特殊限制 |
共 20 个测试点,每个测试点 5 分,合计 100 分。