「Cfz Round 2」01 String
题目描述
定义一个 $\tt{01}$ 串是合法的,当且仅当它的首字符为 $\tt 0$ 而尾字符为 $\tt 1$。我们继而定义一个 $\tt{01}$ 串 $T$ 的权值 $f(T)$ 为,将 $T$ 划分若干个连续的合法子串的方案数。
例如 $f(\tt{001}) = \text{1}$,因为它仅可以被分割为 $[\tt 001]$;$f(\tt{0101101}) = \text{4}$,因为它可以被分割为 $[\tt 0101101][01, 01101][01011, 01][01, 011, 01]$ 共四种不同的方案;而 $f(\tt{1001010101}) = \text{0}$。
给定一个长度为 $n$ 的 $\tt{01}$ 串 $S$。定义 $f_k(l, r) = \begin{cases} f(S_{l\dots r}) & k = 0 \\ \displaystyle\sum_{l\leq l' \leq r' \leq r} f_{k-1}(l', r') & k \gt 0\end{cases}$,你需要求出 $f_k(1, n)$ 的值。
由于答案可能很大,所以你只需要输出答案对 $10^9+7$ 取模的结果。
输入输出格式
输入格式
**本题有多组测试数据。**
第一行输入一个整数 $T$,表示测试数据组数。
接下来依次输入每组测试数据。对于每组测试数据:
+ 第一行输入两个整数 $n,k$,分别表示 $\lvert S\rvert$ 和给定的参数。
+ 接下来一行,输入一个长度为 $n$ 的 $\tt{01}$ 串表示 $S$。
输出格式
对于每组数据,输出一行一个整数,表示答案。
输入输出样例
输入样例 #1
4
3 1
001
5 2
00101
30 10
010100110101001010010010011101
10 1000000000000
0010110101
输出样例 #1
2
19
926292963
340558843
说明
#### 「样例解释 #1」
对于第 $1$ 组数据,用表格的交叉点表示 $f_k(l, r)$ 的值:
| $\bm{k = 0}$ | $r = 1$ | $2$ | $3$ |
| -----------: | :-----: | :-: | :-: |
| $l = 1$ | $0$ | $0$ | $1$ |
| $2$ | / | $0$ | $1$ |
| $3$ | / | / | $0$ |
| $\bm{k = 1}$ | $r = 1$ | $2$ | $3$ |
| -----------: | :-----: | :-: | :-: |
| $l = 1$ | $0$ | $0$ | $2$ |
| $2$ | / | $0$ | $1$ |
| $3$ | / | / | $0$ |
其中:
- $f_1(2, 3)= f_0(2, 2) + f_0(2, 3) + f_0(3, 3)= 0 + 1 + 0 = 1$;
- $f_1(1, 3) = f_0(1, 1) + f_0(1, 2) + f_0(1, 3) + f_0(2, 2) + f_0(2, 3) + f_0(3, 3) = 0 + 0 + 1 + 0 + 1 + 0 = 2$;
所以答案为 $2$。
#### 「数据范围」
设 $\sum n$ 表示单个测试点中 $n$ 的和。
对于所有数据,$1 \leq T \leq 100$,$1 \leq n \leq 2\times 10^5$,$0 \leq k \leq 10^{18}$,$\sum n \leq 6\times 10^5$,保证 $S$ 中只包含 $\tt{0}$ 和 $\tt{1}$。
**只有你通过本题的所有测试点,你才能获得本题的分数。**