一道神仙题,场上只想到一半不到……
题意简述
$\text{Thue−Morse}$ 序列是一个无限长度的序列 $\left\langle T_n\right\rangle$ :
- $T_0 = 0$ ;
- $T_{2n} = T_n$ ;
- $T_{2n + 1} = 1 - T_n$ 。( $n > 0$ )
显然这是一个 $\text{01}$ 序列。现在给定一个 $01$ 序列 $S$ 和一个非负整数 $k$ ,求 $\text{Thue-Morse}$ 序列中有多少本质不同的连续子序列 $T$ 满足:
- $S$ 是 $T$ 前缀;
- $|T| = |S| + k$ ,其中 $|x|$ 表示 $\text{02}$ 序列 $x$ 的长度。
数据组数 $case \le 100$ , $|S| \le 100$ , $0\le k\le 10^{18}$ ,答案模 $10^9+9$ 。
主要思路
据说 $\text{Thue-Morse}$ 序列被出到过很多找规律题里?然而本人才第一次见,充分说明本人刷题量还大大不足……
由于这个序列是个 $\text{01}$ 序列,所以下文可能会把这个序列当成一个 $\text{01}$ 字符串。
关于 $\text{Thue-Morse}$ 序列的性质
以下简称 $\text{Thue-Morse}$ 为 $\text{T.M.}$ 。
场上通过手玩样例和瞪这个序列,不难发现几个性质:
- 每次这个序列会将上一次生成的子串中,
1
变为10
,0
变为01
,接入总串尾部,这我们称为一次生成。
例如,一开始的串是01
,上一次生成的串是1
。接着,这个串会以此变成0110
,01101001
,0110100110010110
…… - 除了
000
与111
之外,其他长度不大于 $3$ 的 $\text{01}$ 字符串都是 $\text{T.M.}$ 串的子串。
同时,如果一个串 $s$ 中有至少三个1
或0
相连,那么这个串不可能是 $\text{T.M.}$ 的子串。 - 对于一个长度大于 $3$ 的串 $s$ ,如果其是 $\text{T.M.}$ 串的子串,它必然是由一长度为 $\lceil\dfrac{n}{2}\rceil$ 或 $\lceil\dfrac{n + 1}{2}\rceil$ 的 $\text{T.M.}$ 串的子串 $t$ 生成的。发现并不用考虑 $t$ 是不是一次生成了 $s$ ,因为即使 $t$ 并不是一次就生成了 $s$ ,生成的 $s$ 也会是连续的。
对于上面的第三条,考虑如何通过 $s$ 反推回 $t$ 。大概思路就是将 01
写为 0
,将 10
写为 1
,适当在串前后补字符。
011001
是如何生成的?
显然这个串可以通过010
生成。001100
是如何生成的?
考虑1010
可以生成10011001
,可得001100
也是由1010
生成的。10010
是如何生成的?
和上面的串思路差不多,发现是由100
生成的。10110
是如何生成的?
也和上面的串思路差不多,发现是由001
生成的。0011001100
是如何生成的?
沿着刚刚的思路推,发现是由101010
生成的。而101010
是由111
生成的。由于111
不是 $\text{T.M.}$ 串的子串,所以0011001100
不是 $\text{T.M.}$ 串的子串。
通过上面的几个例子,又可以大致看出一个结论:
- 对于一个长度大于 $3$ 的串 $s$ ,如果其是 $\text{T.M.}$ 串的子串,它必然是由且仅可能由一长度为 $\lceil\dfrac{n}{2}\rceil$ 或 $\lceil\dfrac{n + 1}{2}\rceil$ 的 $\text{T.M.}$ 串的子串 $t$ 生成的。即不可能通过两个不同的串生成出相同的串。
如果串 $s$ 有子串 00
或子串 11
,因为 0
和 1
生成一次产生的串不能是 00
或 11
,若 $s$ 是 $\text{T.M.}$ 串的子串则 $s$ 只有一种生成方式。
如果串 $s$ 无子串 00
或子串 11
:
- 若长度大于 $4$ ,则可以由
0...0
(或1...1
) 生成,但由于长度大于 $4$ ,所以0
(或1
) 的数量不小于 $3$ ,该串不在 $\text{T.M.}$ 串中。 - 若长度等于 $4$ ,则
0101
由00
、1010
由11
构成。
所以我们终于得出了这题最重要的一个结论。
利用该结论 dp
考虑 $dp(k)$ 为,一个长为 $1$ 的 $\text{01}$ 字符串后任意插入一个长为 $k$ 的后缀,这个串是 $\text{T.M.}$ 的子串的总数。
发现这个串 $1$ 开始是 0
或是 1
答案是相同的。下文钦定这个长为 $1$ 的字符串从 0
开始。
由于这个串一定是由唯一的 $t$ 串生成的,考虑像上文一般寻找这个 $t$ 串。
如果不在串前补 1
,则 $t$ 串是从 0
开始的一个串,后接了长度是 $\lceil\dfrac{k - 1}{2}\rceil$ 的任意后缀,即有 $dp(\lceil\dfrac{k - 1}{2}\rceil)$ 种串在 $\text{T.M.}$ 串内;如果在串前补 1
,则 $t$ 串是从 1
开始的一个串,同理可得有 $dp(\lceil\dfrac{k}{2}\rceil)$ 种 $t$ 串。故得到 $dp(k) = dp(\lceil\dfrac{k - 1}{2}\rceil) + dp(\lceil\dfrac{k}{2}\rceil)$ 。
考虑边界状态。显然,若 $k<3$ 可以预处理出来。$dp(0) = 1, dp(1) = 2, dp(2) = 3$ 。(由于不能是 000
所以 $dp(2) = 3$ )
最后推得答案
设 $Calc(S,k)$ 是询问串为 $S$ ,后缀长度为 $k$ 的答案。
类似 $|S| = 1$ 的询问,可以先确定 $S$ 串是由什么串生成而来的。同样类似 $|S| = 1$ 的询问讨论 $k$ 的取值,注意细节即可。
复杂度没仔细分析……大概一个询问是 $O(|S| + \log_2k)$ 左右?
参考代码
其实代码挺短的,但是为啥把同步关了之后在洛谷 MLE ,在 LOJ RE ……
1 |
|