题目描述
定义一个 01 串是合法的,当且仅当它的首字符为 0 而尾字符为 1。我们继而定义一个 01 串 T 的权值 f(T) 为,将 T 划分若干个连续的合法子串的方案数。
例如 f(001)=1,因为它仅可以被分割为 [001];f(0101101)=4,因为它可以被分割为 [0101101][01,01101][01011,01][01,011,01] 共四种不同的方案;而 f(1001010101)=0。
给定一个长度为 n 的 01 串 S。定义 fk(l,r)=⎩⎨⎧f(Sl…r)l≤l′≤r′≤r∑fk−1(l′,r′)k=0k>0,你需要求出 fk(1,n) 的值。
由于答案可能很大,所以你只需要输出答案对 109+7 取模的结果。
输入格式
本题有多组测试数据。
第一行输入一个整数 T,表示测试数据组数。
接下来依次输入每组测试数据。对于每组测试数据:
- 第一行输入两个整数 n,k,分别表示 ∣S∣ 和给定的参数。
- 接下来一行,输入一个长度为 n 的 01 串表示 S。
输出格式
对于每组数据,输出一行一个整数,表示答案。
提示
「样例解释 #1」
对于第 1 组数据,用表格的交叉点表示 fk(l,r) 的值:
k=0 |
r=1 |
2 |
3 |
l=1 |
0 |
0 |
1 |
2 |
/ |
3 |
/ |
0 |
k=1 |
r=1 |
2 |
3 |
l=1 |
0 |
0 |
2 |
2 |
/ |
1 |
3 |
/ |
0 |
其中:
- f1(2,3)=f0(2,2)+f0(2,3)+f0(3,3)=0+1+0=1;
- f1(1,3)=f0(1,1)+f0(1,2)+f0(1,3)+f0(2,2)+f0(2,3)+f0(3,3)=0+0+1+0+1+0=2;
所以答案为 2。
「数据范围」
设 ∑n 表示单个测试点中 n 的和。
对于所有数据,1≤T≤100,1≤n≤2×105,0≤k≤1018,∑n≤6×105,保证 S 中只包含 0 和 1。
只有你通过本题的所有测试点,你才能获得本题的分数。