G. Dingding and His Favorite Finite Binary String

传统 2000 ms 1024 MiB
标准 IO
Special Judge

题目描述

We all like String with finite length.

有一个长度为nn的二进制字符串,我们将kk个连续的字符分为一组,即第11个字符到第kk个分为一组,第k+1k+1个字符到第2k2k个字符为一组...保证nnkk的倍数。你需要翻转(0变成1,1变成0)其中的一些字符,使得任意一组内的字符全部相等,在翻转次数最少的前提下,我们希望最终字符串被分成的01段的数量也最少。不仅如此,你还需要求出在满足前两个前提下,翻转的方案数有多少。

不同的翻转方案指的是翻转后的两个字符串在任何一个位置不同。

01段是指字符串以子段内全部字符相同为前提下最少划分的段数,例如00100111被划分成4401段,00000000被划分成1101段。

举个例子:
n=4,k=1n=4,k=1时,对于二进制字符串0010,最少需要翻转00次,最少分成的分成的01段的数量为33段,翻转方案数为11种。
n=8,k=4n=8,k=4时,对于二进制字符串00110101,最少需要翻转44次,最少分成的分成的01段的数量为11段,翻转方案为22种,即把字符串翻转为0000000011111111,虽然把字符串翻转成00001111满足任意一组内的字符全部相等满足且翻转44次,但是此时字符串分成的分成的01段的数量为22段,不满足被分成的01段的数量也最少的条件,所以这不是一种合法的方案。

输入格式

第一行,一个整数 t(1t5105)t(1\le t \le 5·10^5),代表数据组数。

对于每组数据:

第一行,两个个整数 n,k(1n5105;1kn)n,k(1\le n \le 5·10^5;1\le k \le n),代表二进制字符串的长度与每组字符的字符数,满足nnkk的倍数。
第二行是一个长度为nn的二进制字符串。

保证 n5105\sum n \le 5·10^5

输出格式

对于每个二进制字符串,输出一行三个整数a,b,ca,b,c,分别代表最少翻转次数、在保持最少翻转次数的前提下分成的01段的最少数量、在满足前两个前提下,翻转的方案数有多少。因为a,b,ca,b,c可能较大,所以你输出答案时需要把三个数对于998244353取模。

样例

输入样例:

3 
4 1 
0010  
8 4 
00110101 
16 2
0100011000011011

输出样例:

0 3 1 
4 1 2 
5 2 3 

样例解释:
对于样例的第1122组数据的解释见题目描述。