CF177G1/CF177G2 Fibonacci Strings 题解
:::::info[闲话]
已完成今日模拟赛挂分 180pts 大学习。
:::::
:::::info[题目基本信息]
考察:
- G1:KMP 算法(
2400 )。 - G2:KMP 算法,矩阵加速(
2600 )。
题目简介:
定义斐波那契串为:
-
f_1=\texttt{a} -
f_2=\texttt{b} -
给定
数据范围:
- G1:
-
1\le n,q,\displaystyle\sum|p|\le 3000
-
- G2:
-
1\le n\le 10^{18} -
1\le q\le 10^4 -
1\le\sum|p|\le 10^5 ::::: G1 对 G2 几乎毫无启发,我们直接看 G2(绝对不是因为不会,而是因为这是 G2 题解)。
G2:
首先在
n\le 10^{18} 时|f_n| 是很爆炸的,我们不能直接算。
在放弃数据结构等若干方法后,我们考虑 DP,设F_n 为f_n 中p 的出现次数,容易发现出现的p 只能有这三种情况: - 出现在
f_{n-1} 中。 - 出现在
f_{n-2} 中。 - 一段非空前缀出现在
f_{n-1} 中,一段非空后缀出现在f_{n-2} 中。
-
设第
现在我们重点解决
想要既有字符出现在
但是我们观察得到,
由于首先这个字符串要有
我们找到了
那么我们现在要算
代入
这个东西显然可以用矩阵快速幂维护,开一个
然后做完了,代码长度也并不长,感觉就是 KMP 板子和矩阵快速幂板子拼了起来。
时间复杂度为
code