```go
package main
import (
"bytes"
"io"
"math/bits"
"os"
"strconv"
)
type FastScanner struct {
data []byte
idx int
n int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data, n: len(data)}
}
func (fs *FastScanner) nextInt() int {
for fs.idx < fs.n && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
fs.idx++
}
val := 0
for fs.idx < fs.n && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
val = val*10 + int(fs.data[fs.idx]-'0')
fs.idx++
}
return val
}
func (fs *FastScanner) nextString() string {
for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
fs.idx++
}
start := fs.idx
for fs.idx < fs.n && fs.data[fs.idx] > ' ' {
fs.idx++
}
return string(fs.data[start:fs.idx])
}
type Pre struct {
d uint
P uint64
fullParity uint8
fullXor uint64
prefParity []uint8
prefXor []uint64
}
func xorUpto(n uint64) uint64 {
switch n & 3 {
case 0:
return n
case 1:
return 1
case 2:
return n + 1
default:
return 0
}
}
func build(p int) *Pre {
d := bits.Len(uint(p - 1))
P := 1 << d
a := make([]uint8, P)
for k := 0; k < p; k++ {
if ((p-k-1)&(k>>1)) == 0 {
a[k] = 1
}
}
for bit := 1; bit < P; bit <<= 1 {
step := bit << 1
for start := 0; start < P; start += step {
for i := start + bit; i < start+step; i++ {
a[i] ^= a[i-bit]
}
}
}
prefParity := make([]uint8, P+1)
prefXor := make([]uint64, P+1)
for i := 0; i < P; i++ {
prefParity[i+1] = prefParity[i] ^ a[i]
prefXor[i+1] = prefXor[i]
if a[i] == 1 {
prefXor[i+1] ^= uint64(i)
}
}
return &Pre{
d: uint(d),
P: uint64(P),
fullParity: prefParity[P],
fullXor: prefXor[P],
prefParity: prefParity,
prefXor: prefXor,
}
}
func main() {
fs := NewFastScanner()
t := fs.nextInt()
cache := make(map[int]*Pre)
var out bytes.Buffer
for ; t > 0; t-- {
_ = fs.nextInt()
m := uint64(fs.nextInt())
s := fs.nextString()
p := 0
for i := 0; i < len(s); i++ {
if s[i] == '1' {
p++
}
}
pre := cache[p]
if pre == nil {
pre = build(p)
cache[p] = pre
}
cnt := m / pre.P
rem := int(m % pre.P)
var ans uint64
if cnt&1 == 1 {
ans ^= pre.fullXor
}
if pre.fullParity == 1 && cnt > 0 {
ans ^= xorUpto(cnt-1) << pre.d
}
ans ^= pre.prefXor[rem]
if pre.prefParity[rem] == 1 {
ans ^= cnt << pre.d
}
out.WriteString(strconv.FormatUint(ans, 10))
out.WriteByte('\n')
}
os.Stdout.Write(out.Bytes())
}
```