

这道题难度挺大的,尤其是最后一个点。
首先观察数据点,前24个点数字串s的长度是1或2,
其次n特别大 ,肯定是要用到快速幂的,CCF CSP不止一次考过快速幂
当s的长度为1或2时,通过简单的排列组合知识也知道,s的情况并不多,我们可以直接枚举转移方程,转移方程如下。

显然我们需要矩阵快速幂。
当s的长度为1或2时,s的情况只有以上14种
我们构造转移矩阵的时候,可以考虑将这些点离散化,即只构造一个14*14的转移矩阵
按照这十四个离散的值从小到大,分别映射成0到13.
只要转移矩阵给出来了,套下矩阵快速幂的板子,前96分就到手了。
重点是最后四分。
根据y总的视频讲解,当s的长度大于2时,我们可以根据转移的规律,逆推到s只有两位的情况。
s是由什么转移过来的呢?
s在整个序列的情况,可能分为s前面是1,s前面是6,或者s前面不是1或6.
它对应的转移情况不尽相同
下列代码中的get的函数,是求s上一层是由什么转移过来的。
如果不存在转移到s的上一层,则返回空串。
如果存在,就递归查找,直到查找到上一层的长度是2.
LL dfs(int x,string&sub)
{
if(sub.size()<=2)return qpow(x,id[stoi(sub)]);//如果长度小于等于2,直接矩阵快速幂求
LL res=0;
for(string s:{"","1","6"}){//
string tmp=get(s+sub);
&

这篇博客探讨了一道涉及字符串序列转换的难题,其中涉及到快速幂运算和矩阵快速幂的应用。作者首先分析了数据特点,指出当字符串长度为1或2时可以直接枚举,然后构建了14x14的转移矩阵。通过矩阵快速幂解决小规模问题,并通过逆推处理字符串长度大于2的情况。代码中展示了如何实现这个算法,包括转移矩阵的初始化、矩阵乘法和快速幂运算。

1464

被折叠的 条评论
为什么被折叠?



