最关键的一点就是

f[ 0 ] * a[ 0 ] + f[ 1 ] * a[ 1 ] + ... + f[ n - 1] * a[ n  - 1]

f[ 1 ] * a[ 0 ] + f[ 2 ] * a[ 1 ] + ... + f[ n ] * a[ n  - 1]

f[ 2 ] * a[ 0 ] + f[ 3 ] * a[ 1 ] + ... + f[ n + 1] * a[ n  - 1]

......

这也是满足斐波那切的性质

也就是说,系数的斐波那切的多项式也能向斐波那切一样递推。

然后我们在线段树上保存系数为f[ 0 ]开始的多项式的值和系数为f[ 1 ]开始的多项式的值。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); void add(int& a, int b) {
a += b; if(a >= mod) a -= mod;
} int mat[N][][], f[N], g[N]; void print(int o) {
puts("");
for(int i = ; i < ; i++) {
for(int j = ; j < ; j++) {
printf("%d ", mat[o][i][j]);
}
puts("");
}
} #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
int f0[N << ], f1[N << ];
int lazy[N << ]; inline int getVal(int f0, int f1, int k) {
if(k == ) return f0;
else if(k == ) return f1;
else return (1LL * mat[k - ][][] * f1 % mod + 1LL * mat[k - ][][] * f0 % mod) % mod;
}
void pull(int rt, int l, int r) {
int mid = l + r >> ;
f0[rt] = f0[rt << ];
f1[rt] = f1[rt << ];
add(f0[rt], getVal(f0[rt << | ], f1[rt << | ], mid - l + ));
add(f1[rt], getVal(f0[rt << | ], f1[rt << | ], mid - l + ));
}
void push(int rt, int l, int r) {
int mid = l + r >> ;
if(lazy[rt]) {
add(lazy[rt << ], lazy[rt]);
add(lazy[rt << | ], lazy[rt]);
add(f0[rt << ], 1LL * lazy[rt] * f[mid - l] % mod);
add(f0[rt << | ], 1LL * lazy[rt] * f[r - mid - ] % mod);
add(f1[rt << ], 1LL * lazy[rt] * g[mid - l] % mod);
add(f1[rt << | ], 1LL * lazy[rt] * g[r - mid - ] % mod);
lazy[rt] = ;
}
}
void build(int l, int r, int rt) {
if(l == r) {
scanf("%d", &f0[rt]);
f1[rt] = f0[rt];
return;
}
int mid = l + r >> ;
build(lson); build(rson);
pull(rt, l, r);
}
void update(int L, int R, int d, int l, int r, int rt) {
if(r < L || R < l) return;
if(L <= l && r <= R) {
add(f0[rt], 1LL * d * f[r - l] % mod);
add(f1[rt], 1LL * d * g[r - l] % mod);
add(lazy[rt], d);
return ;
}
push(rt, l, r);
int mid = l + r >> ;
update(L, R, d, lson);
update(L, R, d, rson);
pull(rt, l, r);
}
int query(int L, int R, int l, int r, int rt) {
if(r < L || R < l) return ;
if(L <= l && r <= R) return getVal(f0[rt], f1[rt], l - L);
push(rt, l, r);
int mid = l + r >> ;
return (query(L, R, lson) + query(L, R, rson)) % mod;
} int n, m;
int main() {
mat[][][] = ; mat[][][] = ;
mat[][][] = ; mat[][][] = ;
mat[][][] = mat[][][] = ;
mat[][][] = ; mat[][][] = ;
for(int o = ; o < N; o++) {
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < ; k++)
mat[o][i][j] = (mat[o][i][j] + 1LL * mat[][i][k] * mat[o - ][k][j] % mod) % mod;
}
f[] = f[] = ;
for(int i = ; i < N; i++) f[i] = (f[i - ] + f[i - ]) % mod;
for(int i = ; i < N; i++) add(f[i], f[i - ]);
g[] = , g[] = ;
for(int i = ; i < N; i++) g[i] = (g[i - ] + g[i - ]) % mod;
for(int i = ; i < N; i++) add(g[i], g[i - ]); scanf("%d%d", &n, &m);
build(, n, );
while(m--) {
int op;
scanf("%d", &op);
if(op == ) {
int x, v;
scanf("%d%d", &x, &v);
int ret = query(x, x, , n, );
update(x, x, -ret, , n, );
update(x, x, v, , n, );
} else if(op == ) {
int L, R;
scanf("%d%d", &L, &R);
printf("%d\n", query(L, R, , n, ));
} else {
int L, R, d;
scanf("%d%d%d", &L, &R, &d);
update(L, R, d, , n, );
}
}
return ;
} /*
*/

Codeforces 316E3 线段树 + 斐波那切数列 (看题解)的更多相关文章

  1. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

  2. Codeforces 446-C DZY Loves Fibonacci Numbers 同余 线段树 斐波那契数列

    C. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory limit per test 256 megabytes inp ...

  3. 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)

    Description ​ 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...

  4. python---复杂度、斐波那切数列、汉诺塔

    时间复杂度 ​ 用来估计算法运行时间的一个式子. ​ 一般来说, 时间复杂度高的算法比复杂度低的算法慢. 常见的时间复杂度: ​ O(1) < O(logn) < O(n) < O( ...

  5. [莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II

    题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中 ...

  6. Linux环境C语言斐波拉切数列(1,1,2,3,5,8,13,.........)实现

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...

  7. 从斐波那契数列看java方法的调用过程

    先看斐波那契数列的定义: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为 ...

  8. (转)从斐波那契数列看Java方法的调用过程

    斐波那契数列的定义: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家列安纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔 ...

  9. hdu 4983 线段树+斐波那契数

    http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d, 修改k的为值增加d 2 l r, 查询l到r的区间和 3 l r, 从l到r区间 ...

随机推荐

  1. python安装提示No module named setuptools,wget提示ERROR 403: SSL is required

    在下载安装一个python工具时提示报错No module named setuptools [root@kermit supervisor-3.3.0]$ sudo python setup.py ...

  2. 压缩JS的eclipse插件

    主页:http://jscompressor.oncereply.me/ Update site: http://jscompressor.oncereply.me/update/

  3. cemtos7.2搭建samba

    1背景 转到Linux有段时间了,vim操作还不能应对工程代码,之前一直都是Gnome桌面 + Clion 作开发环境,无奈在服务器上没有这样的环境, 看同事是(Windows)Source Insi ...

  4. Python-数据库 基本SQL语句

    1. 数据库是什么 2. MySQL安装 3. 用户授权 4. 数据库操作 - 数据表 - 数据类型 - 是否可以为空 - 自增 - 主键 - 外键 - 唯一索引 数据行 增 删 改 查 排序: or ...

  5. Android启动模式之singleinstance的坑

    前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...

  6. Swift 学习- 08 -- 闭包

    // 闭包是自包含的函数代码块, 可以在代码中被传递和使用, swift 中的闭包 与 C语言 和 OC 中的代码块 (blocks) 以及其他一些编程语言中的匿名函数比较类似 // 闭包可以捕获和存 ...

  7. CSS3-字体渐变色

    示例:Mauger`s Blog <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"& ...

  8. conda 安装多个版本的python

    再添加一个python3.6conda create --name py36 python=3.6然后通过source activate py36来激活环境

  9. python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除

    js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...

  10. HTML&javaSkcript&CSS&jQuery&ajax(七)

    ’一.HTML5 实例  <video width="430" controls>   <source src="mov_nnn.mp4" t ...