📜  门| GATE CS Mock 2018 |第 49 题(1)

📅  最后修改于: 2023-12-03 15:28:39.340000             🧑  作者: Mango

题目描述

本题是门| GATE CS Mock 2018 |第 49 题

给定一个字符串,由 0 和 1 构成,长度为 $n$。将其看作一个环,将每个字符的后一个字符与其进行异或运算,结果得到的字符作为新串的该字符,得到一个新串。例如,若原串为 1101,则得到新串为 1011。

重复以上操作 $m$ 次后,请输出新串中 1 的个数。

输入格式
  • 第一行包含一个整数 $T$,表示测试用例的组数。
  • 对于每个测试用例,第一行包含两个整数 $n$ 和 $m$($1 \leq n \leq 10^5, 1 \leq m \leq 10^9$),第二行为长度为 $n$ 的二进制字符串。
输出格式
  • 对于每个测试用例,输出一个整数,其表示新串中 1 的个数。
示例输入
2
7 1
1010101
7 2
1010101
示例输出
4
3
解题思路

首先,考虑到环的性质。将每个字符后一个字符与其异或可以看作是对于每个字符 $S[i]$ 定义一个函数 $f(i) = S[i] \oplus S[(i+1)\mod n]$,$0 \leq i < n$,则经过一次变换后新串为 $f(0)f(1)...f(n-1)$。考虑将这 $n$ 个函数串联起来,则经过 $m$ 次变换后新串为 $F^m(0)F^m(1)...F^m(n-1)$,其中 $F$ 为函数的复合。

接下来,考虑一个长度为 $n$ 的初始串与一个长度为 $n$ 的全 0 串的异或。设其结果为 $x$,则可以发现,经过一次函数变换后,$x$ 的值会发生两次变化:第一次,由于 $f(n-1)$ 变为 $f(0)$,$x$ 的最高位即 $x_{n-1}$ 发生变化;第二次,由于 $f(0)$ 进行了一次异或,$x$ 的最低位即 $x_0$ 发生变化。设 $W_x$ 为 $x$ 的 二进制 系数,$M$ 为 $n \times n$ 的矩阵,则有:

$$ W_x \rightarrow \begin{pmatrix} 0 & 0 & \cdots & 0 & S_0 \cr 1 & 0 & \cdots & 0 & S_1 \cr 0 & 1 & \cdots & 0 & S_2 \cr \vdots & \vdots & \ddots & \vdots & \vdots \cr 0 & 0 & \cdots & 1 & S_{n-1} \end{pmatrix} \times W_x $$

因此,经过 $m$ 次变换后新串中 1 的个数可以通过矩阵快速幂得到。

代码如下: