题目描述
宫水三叶在教妹妹四则运算。她出了这样一道题:给定一个长度为 n n n 的合法运算表达式,求该表达式的值。
为了降低题目难度,三叶规定数字只有 1 ∼ 9 1\sim 9 1∼9 ,运算符只有加号和乘号。
为了规范题目,三叶对合法的表达式做了以下规定:
- 数字 1 ∼ 9 1\sim 9 1∼9 是合法表达式。
- 如果表达式 A A A 是合法表达式,那么 ( A ) (A) (A) 是合法表达式。
- 如果表达式 A , B A,B A,B 是合法表达式,那么 A + B , A × B A+B,A\times B A+B,A×B 是合法表达式。
- 以上三条规则可以构造出所有的合法表达式。
三叶把括号,数字,运算符等都做成了卡片,并摆出了表达式。
然而,不知道谁趁三叶不注意,把表达式中的运算符都取下来了。
三叶知道哪些位置有运算符,但是不知道每个运算符是什么。她只知道总共有 m m m 个运算符空位,而手上有 k k k 张加法的卡片和 m − k m-k m−k 张乘法的卡片。
因此三叶想知道,对于所有可能的表达式,表达式的值的和是多少。
由于这个值很大,因此三叶只想知道其对 1 0 9 + 7 10^9+7 109+7 取模后的结果。
形式化题意
给定一个长度为 n n n 的表达式,表达式合法,并且只出现括号,减号和数字 1 ∼ 9 1\sim 9 1∼9 。其中减号代表运算符的空位,设有 m m m 个。
给定 k k k ,你要把 k k k 个减号替换成加号,把 m − k m-k m−k 个减号替换成乘号。求所有本质不同的替换方案表达式的和对 1 0 9 + 7 10^9+7 109+7 取模后的值。
第一行两个整数 n , k n,k n,k ,表示运算式长度和加号的个数。
第二行一个长度为 n n n 的字符串,表示运算式。
输出一行,表示所有可能出现的表达式的和对 1 0 9 + 7 10^9+7 109+7 取模后的结果。
样例输入 1
5 1
1-2-3
样例输出 1
12
样例解释 1
共有两个运算符,其中一个为加号。
共有两个合法的表达式:
- 1 + 2 × 3 = 7 1+2\times 3=7 1+2×3=7 。
- 1 × 2 + 3 = 5 1\times 2+3=5 1×2+3=5 。
因此答案为 7 + 5 = 12 7+5=12 7+5=12 。
样例数据 2,3
见下发文件。
本题采用捆绑测试,每个子任务 20 20 20 分。
对于所有数据,满足 1 ≤ n ≤ 1 0 5 , 0 ≤ m ≤ 2500 , 0 ≤ k ≤ m 1 \le n \le 10^5,0 \le m \le 2500,0 \le k \le m 1≤n≤105,0≤m≤2500,0≤k≤m。
保证给出的表达式合法。
子任务见下表:
子任务编号 | m m m | 特殊性质 |
---|---|---|
1 1 1 | ≤ 20 \le 20 ≤20 | 无 |
2 2 2 | ≤ 300 \le 300 ≤300 | 无 |
3 3 3 | ≤ 2500 \le 2500 ≤2500 | 特殊性质 A |
4 4 4 | ≤ 2500 \le 2500 ≤2500 | 特殊性质 B |
5 5 5 | ≤ 2500 \le 2500 ≤2500 | 无 |
特殊性质 A:满足 k = 0 k=0 k=0 。
特殊性质 B:保证表达式中不出现括号。
首先基础套路 即为去括号,转化为树上操作。。。
这时随便DP即可。。
代码:
咕咕咕