CF575A Fibonotci 题解

原题链接:CF575A

前言

今天模拟赛考到了这道题,最近正好在学习矩阵,于是就来写了这道题,发现这道题是矩阵快速幂好题。

题意

题意不多赘述,大概就是一个广义斐波那契数列的升级版,可以修改 \(m\) 个系数。

思路

因为题目是求斐波那契数列的第 \(k\) 项,显然用矩阵去维护。又因为题目说了,如果不算修改的 \(m\) 个的话,那么每 \(n\) 个就是一个循环节,于是我们可以考虑分段去计算。

首先把所有的分成 \(k / n\) 段,每段长度都为 \(n\)。依次遍历每一个区间,如果当前段内没有修改操作的话,就直接用矩阵快速幂进行计算。如果有修改的话,那么就直接修改之后再计算。时间复杂度 \(O(k/n\times \log n)\)。但是题目数据范围是 \(k \le 10^{18}\),这样肯定会超时,于是考虑优化。

因为修改次数最多 \(m\) 次,每一次修改最多影响两个区间,所以最多只能改变 \(2m\) 个区间。我们可以先把普通的区间答案算出来,这 \(2m\) 个区间单独算,最后加起来,时间复杂度 \(O(nm)\),还是会超时。

还需要优化。这时我们发现其实这道题就是让我们对矩阵进行修改,求乘积。可以想到用线段树优化矩阵快速幂,支持单点修改,全局查询。时间复杂度 \(O(m\log n)\),可以通过。

代码过于冗长杂乱,在这里就不贴了。

评测记录

posted @ 2023-12-19 11:46  Creeper_l  阅读(2)  评论(0编辑  收藏  举报