个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客
要求支持区间和操作,查询元素作为下标时的斐波那契和
转换为矩阵快速幂形式,用线段树解决。
洛谷传送门:CF718C Sasha and Array - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
CF传送门:C. Sasha and Array (codeforces.com)
题目分析转换为矩阵快速幂形式,区间加 X X X的操作即可表示为区间的所有矩阵全部乘转移矩阵的 x x x次方
区间查询斐波那契和即为区间矩阵和第二项(视具体情况而定)
关键点:斐波那契矩阵快速幂做法满足可加性(运算结果即答案)和乘法分配律 ( a ∗ c + b ∗ c = ( a + b ) ∗ c ) (a * c + b * c = (a + b) * c) (a∗c+b∗c=(a+b)∗c)
此外,你还需要一个比较好用的矩阵运算类。这里我习惯用ECNU的板子…
关于矩阵快速幂的讲解:这里直接放Fib的讲解,具体可以参考我之前的博客:矩阵快速幂 - HeartFireY
给定整数 n n n,计算斐波那契数列的第 n n n项 F n F_n Fn。
首先,观察斐波那契数列的特征:递推公式: F n = F n − 1 + F n − 2 F_n = F_{n-1} + F_{n-2} Fn=Fn−1+Fn−2
我们不难发现: F n F_n Fn与 F n − 1 F_{n- 1} Fn−1和 F n − 1 F_{n - 1} Fn−1与 F n − 2 F_{n -2} Fn−2之间的关系可以用矩阵的乘法关系进行描述: [ F n − 1 F n ] = [ F n − 2 F n − 1 ] ⋅ [ 0 1 1 1 ] \begin{bmatrix} F_{n - 1}&F_{n}\\ \end{bmatrix} \ = \ \begin{bmatrix} F{n - 2}&F_{n - 1} \end{bmatrix} \ \cdot \ \begin{bmatrix} 0&1\\ 1&1\\ \end{bmatrix} [Fn−1Fn] = [Fn−2Fn−1] ⋅ [0111] 不妨设 P = [ 0 1 1 1 ] P = \begin{bmatrix}0 & 1 \cr 1 & 1 \cr\end{bmatrix} P=[0111],改写递推公式,可得: [ F n F n + 1 ] = [ F 0 F 1 ] ⋅ P n \begin{bmatrix}F_n & F_{n+1} \cr\end{bmatrix} = \begin{bmatrix}F_0 & F_1 \cr\end{bmatrix} \cdot P^n [FnFn+1]=[F0F1]⋅Pn 于是我们可以用矩阵乘法在 Θ ( log n ) \Theta(\log n) Θ(logn) 的时间内计算斐波那契数列。那么本题我们只需要维护区间乘ji’ke
Code#include
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, MOD = 1e9 + 7;
int a[N];
namespace ffastIO {
const int bufl = 1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?