#CF2255B. 送给明天的丝带 / A Ribbon for Tomorrow
送给明天的丝带 / A Ribbon for Tomorrow
题目描述
Nephren向来不喜欢冗长的告别。在Chtholly动身去执行下一项任务之前,她一言不发,转而准备一条小小的丝带送给她。
她在桌上将 颗玻璃珠子摆成一排,之后把它们串到丝带上。每一颗珠子是白色或者黑色。用一个二进制字符串 表示珠子的颜色:字符 代表白色珠子,字符 代表黑色珠子。
为了让排布不那么普通,Nephren把这件事变成了一个小游戏。她可以执行下面的操作任意次(可以是 次):
- 选定两个下标 和 (),满足当前字符串中 ,将子串 翻转。
举个例子,如果 ,Nephren可以选 ,,因为 。操作之后字符串变为 。
求从初始串 出发,能够得到多少种互不相同的二进制字符串。答案可能很大,请输出答案对 取模后的结果。
注:二进制字符串指每一个字符只能是 或者 的字符串。 翻转子串 ,就是把它替换成 。
输入
每个测试点包含多组测试用例。第一行输入测试用例的数量 ()。接下来给出各组测试用例。
每组测试用例第一行输入一个整数 (),代表珠子的数量。
第二行输入长度为 的二进制字符串 ,描述珠子的颜色。
保证所有测试用例的 之和不超过 。
输出
对每一组测试用例,输出一个整数:从初始串 可以得到的不同二进制字符串的数量,对 取模。
样例
4
5
00110
6
001010
5
01010
6
111111
2
3
1
1
说明
第一组测试用例,仅可以得到下面两个字符串:
- ;
- 。
例如翻转整个字符串 就可以得到 。
第二组测试用例,仅可以得到下面三个字符串:
- ;
- ;
- 。
例如 可以通过翻转 的前四个字符得到; 可以翻转整个 得到。
第三组测试用例中,所有两端字符相等的子串本身都是回文串。因此任意合法翻转都不会改变字符串,仅能得到原串 。
第四组测试用例,只能得到 。