We all like String with finite length.
有一个长度为n的二进制字符串,我们将k个连续的字符分为一组,即第1个字符到第k个分为一组,第k+1个字符到第2k个字符为一组...保证n为k的倍数。你需要翻转(0变成1,1变成0)其中的一些字符,使得任意一组内的字符全部相等,在翻转次数最少的前提下,我们希望最终字符串被分成的01段的数量也最少。不仅如此,你还需要求出在满足前两个前提下,翻转的方案数有多少。
不同的翻转方案指的是翻转后的两个字符串在任何一个位置不同。
01段是指字符串以子段内全部字符相同为前提下最少划分的段数,例如00100111被划分成4个01段,00000000被划分成1个01段。
举个例子:
当n=4,k=1时,对于二进制字符串0010,最少需要翻转0次,最少分成的分成的01段的数量为3段,翻转方案数为1种。
当n=8,k=4时,对于二进制字符串00110101,最少需要翻转4次,最少分成的分成的01段的数量为1段,翻转方案为2种,即把字符串翻转为00000000或11111111,虽然把字符串翻转成00001111满足任意一组内的字符全部相等满足且翻转4次,但是此时字符串分成的分成的01段的数量为2段,不满足被分成的01段的数量也最少的条件,所以这不是一种合法的方案。
第一行,一个整数 t(1≤t≤5⋅105),代表数据组数。
对于每组数据:
第一行,两个个整数 n,k(1≤n≤5⋅105;1≤k≤n),代表二进制字符串的长度与每组字符的字符数,满足n是k的倍数。
第二行是一个长度为n的二进制字符串。
保证 ∑n≤5⋅105。
对于每个二进制字符串,输出一行三个整数a,b,c,分别代表最少翻转次数、在保持最少翻转次数的前提下分成的01段的最少数量、在满足前两个前提下,翻转的方案数有多少。因为a,b,c可能较大,所以你输出答案时需要把三个数对于998244353取模。
输入样例:
3
4 1
0010
8 4
00110101
16 2
0100011000011011
输出样例:
0 3 1
4 1 2
5 2 3
样例解释:
对于样例的第1、2组数据的解释见题目描述。