更好的阅读体验

Portal

Portal1: Codeforces

Portal2: Luogu

Description

In mathematical terms, the sequence \(F_n\) of Fibonacci numbers is defined by the recurrence relation

\[F_1 = 1; F_2 = 1; F_n = F_n - 1 + F_n - 2 (n > 2)\]

DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of \(n\) integers: \(a1, a2, \cdots , an\). Moreover, there are \(m\) queries, each query has one of the two types:

  1. Format of the query "1 l r". In reply to the query, you need to add \(F_i - l + 1\) to each element ai, where \(l \le i \le r\).

  2. Format of the query "2 l r". In reply to the query you should output the value of modulo \(1000000009 (10^9 + 9)\).

Help DZY reply to all the queries.

Input

The first line of the input contains two integers \(n\) and \(m (1 \le n, m \le 300000)\). The second line contains \(n\) integers \(a_1, a_2, \cdots , a_n (1 \le ai \le 10^9)\) — initial array \(a\) .

Then, \(m\) lines follow. A single line describes a single query in the format given in the statement. It is guaranteed that for each query inequality \(1 \le l \le r \le n\) holds.

Output

For each query of the second type, print the value of the sum on a single line.

Sample Input

4 4
1 2 3 4
1 1 4
2 1 4
1 2 4
2 1 3

Sample Output

17
12

Sample Explain

After the first query, \(a = [2, 3, 5, 7]\).

For the second query, \(sum = 2 + 3 + 5 + 7 = 17\).

After the third query, \(a = [2, 4, 6, 9]\).

For the fourth query, \(sum = 2 + 4 + 6 = 12\).

Description in Chinese

题目让我们求给你一个序列,支持区间加Fibonacci数列前r - l + 1项和查询区间和。

Solution

一些约定:把斐波那契数列的前两个数\(F_1 = 1, F_2 = 1\)换成另两个数,仍满足\(F_n = F_{n - 1} + F_{n - 2}(n > 2)\)的数列称为广义斐波那契数列。

Fibonacci数列有一些性质:

性质\(1\). \(F_n = (\sum^{n - 2}_{i = 1}{F_i}) + F_2(n > 2)\);

证明如下:

首先将前几项Fibonacci数列展开。

F(1) = 1
F(2) = 1
F(3) = F(1) + F(2)
F(4) = F(2) + F(3) = F(2) + F(1) + F(2)
F(5) = F(3) + F(4) = F(3) + F(2) + F(1) + F(2)
F(6) = F(4) + F(5) = F(4) + F(3) + F(2) + F(1) + F(2)
......

在\(F_n = F_{n - 1} + F_{n - 2}\)中,我们可以把\(F_{n - 1}\)按式子展开,可得\(F_n = \sum^{n - 3}_{i = 1} + F_2 + F_{n - 2}\),即\(F_n = (\sum^{n - 2}_{i = 1}{F_i}) + F_2(n > 2)\),跟原式一模一样,故原式正确性得证。

性质\(2\). 一个广义斐波那契数列数列\(f_i\), 当\(f_1 = x, f_2 = y\)时,则有\(f_n = x \times f_{n - 1} + y \times f_{n - 2}\)

证明如下:

这个性质与性质1类似,证明方法也与性质1类似,列举几个:

f(1) = x
f(2) = y
f(3) = f(1) + f(2) = x × F(1)
f(4) = f(2) + f(3) = x × F(1) + y × F(2)
f(5) = f(3) + f(4) = x × F(2) + y × F(3)
f(6) = f(4) + f(5) = x × F(3) + y × F(4)
......

把上述规律推广到代数式:

\[f_n = f_{n - 1} + f_{n - 2} \\\\ \quad = x \times f_{n - 2} + y \times f_{n - 3} + x \times f_{n - 3} + y \times f_{n - 4} \\\\ \quad = x \times (f_{n - 2} + f_{n - 3}) + y \times (f_{n - 3} + f_{n - 4}) \\\\ \quad = x \times f_{n - 1} + y \times f_{n - 2}\]

证毕。

性质\(3\): 任意两段不同的广义斐波那契数列段相加(逐项相加),所得的数列任然是广义斐波那契数列。

这个性质易证。


这题我们维护一棵线段树,线段树需要维护\(L\)至\(R\)区间的广义斐波那契数列的第一项,第二项与区间的和。

下传标记时,我们可以在左区间加广义斐波那契数列的前两项,在右区间可以求出总和再加上总和就行了,时间复杂\(\text{O(n log n)}\)。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>using namespace std;typedef long long LL;
const int MAXN = 300005, MAXM = 1200005, mod = 1e9 + 9;
struct node {int c1, c2, sum;
} tree[MAXM];
int n, m, opt, x, y, a[MAXN], f[MAXN];
inline int add(int x, int y) {//两项相加并取模int ret = x + y;if (ret < 0) return ret += mod; else return ret % mod;
}
inline int calc1(int x, int y, int len) {//计算斐波那契if (len == 1) return x; elseif (len == 2) return y; else return ((LL)x * f[len - 2] + (LL)y * f[len - 1]) % mod;
}
inline int calc2(int x, int y, int len) {//计算总和if (len == 1) return x; elseif (len == 2) return add(x, y); else return add(calc1(x, y, len + 2), -y);
}
inline void pushup(int rt) {tree[rt].sum = add(tree[rt << 1].sum, tree[rt << 1 | 1].sum);
}
inline void pushdown(int rt, int l, int r) {//下传标记if (tree[rt].c1) {int mid = l + r >> 1;tree[rt << 1].c1 = add(tree[rt << 1].c1, tree[rt].c1);tree[rt << 1].c2 = add(tree[rt << 1].c2, tree[rt].c2);tree[rt << 1].sum = add(tree[rt << 1].sum, calc2(tree[rt].c1, tree[rt].c2, mid - l + 1));int x = calc1(tree[rt].c1, tree[rt].c2, mid - l + 2), y = calc1(tree[rt].c1, tree[rt].c2, mid - l + 3);tree[rt << 1 | 1].c1 = add(tree[rt << 1 | 1].c1, x);tree[rt << 1 | 1].c2 = add(tree[rt << 1 | 1].c2, y);tree[rt << 1 | 1].sum = add(tree[rt << 1 | 1].sum, calc2(x, y, r - mid));tree[rt].c1 = 0; tree[rt].c2 = 0;}
}
inline void update(int rt, int l, int r, int ansl, int ansr) {//线段树区间更新if (ansl <= l && r <= ansr) {tree[rt].c1 = add(tree[rt].c1, f[l - ansl + 1]);tree[rt].c2 = add(tree[rt].c2, f[l - ansl + 2]);tree[rt].sum = add(tree[rt].sum, calc2(f[l - ansl + 1], f[l - ansl + 2], r - l + 1));return ;}pushdown(rt, l, r);int mid = l + r >> 1;if (ansl <= mid) update(rt << 1, l, mid, ansl, ansr);if (ansr > mid) update(rt << 1 | 1, mid + 1, r, ansl, ansr);pushup(rt);
}
inline int query(int rt, int l, int r, int ansl, int ansr) {//线段树区间查询int ret = 0;if (ansl <= l && r <= ansr) {ret = tree[rt].sum;return ret;}pushdown(rt, l, r);int mid = l + r >> 1;if (ansl <= mid) ret = add(ret, query(rt << 1, l, mid, ansl, ansr));if (ansr > mid) ret = add(ret, query(rt << 1 | 1, mid + 1, r, ansl, ansr));return ret;
}
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &x);a[i] = add(a[i - 1], x);}f[1] = 1; f[2] = 1;for (int i = 3; i <= n + 2; i++)f[i] = add(f[i - 1], f[i - 2]);for (int i = 1; i <= m; i++) {scanf("%d%d%d", &opt, &x, &y);if (opt == 1) update(1, 1, n, x, y); else printf("%d\n", add(query(1, 1, n, x, y), a[y] - a[x - 1]));}return 0;
}

转载于:https://www.cnblogs.com/shenxiaohuang/p/11290278.html

『题解』Codeforces446C DZY Loves Fibonacci Numbers相关推荐

  1. Codeforces446C - DZY Loves Fibonacci Numbers

    Portal Description 给出一个\(n(n\leq3\times10^5)\)个数的序列,进行\(m(m\leq3\times10^5)\)次操作,操作有两种: 给区间\([L,R]\) ...

  2. Codeforces 446C —— DZY Loves Fibonacci Numbers(线段树)

    题目:DZY Loves Fibonacci Numbers 题意比較简单,不解释了. 尽管官方的题解也是用线段树,但还利用了二次剩余. 可是我没有想到二次剩余,然后写了个感觉非常复杂度的线段树,还是 ...

  3. Codeforces 446C. DZY Loves Fibonacci Numbers【斐波那契+线段树】

    C. DZY Loves Fibonacci Numbers [题目描述] 传送门 [题解] 我们可以知道斐波那契数列有两个性质: ∑i=1nFi=Fn+2−F2\sum_{i=1}^{n} F_i= ...

  4. Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers

    參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...

  5. Codeforces 446C. DZY Loves Fibonacci Numbers (Fibonacci + 线段树)

    Description In mathematical terms, the sequence F n of Fibonacci numbers is defined by the recurrenc ...

  6. C. DZY Loves Fibonacci Numbers(线段树fibonacci)

    C. DZY Loves Fibonacci Numbers(线段树&fibonacci) 考虑fibonaccifibonaccifibonacci的几个性质: 两个的广义斐波那契数列和仍是 ...

  7. [CF446C]DZY Loves Fibonacci Numbers

    Description: 给出一个数列,每次可以选取一个区间,按顺序加上第i个Fibonacci Numbers(斐波那契数)进行更新,也可以查询某一个区间的总和. Hint: \(n \le 3*1 ...

  8. 『题解』洛谷P2357 守墓人

    Portal Portal1: Luogu Description 在一个荒凉的墓地上有一个令人尊敬的守墓人,他看守的墓地从来没有被盗过, 所以人们很放心的把自己的先人的墓安顿在他那守墓人能看好这片墓 ...

  9. 『题解』洛谷P3958 奶酪

    Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无 ...

  10. 『题解』LibreOJ #563. Snakes 的 Naïve Graph

    #563. 「LibreOJ Round #10」Snakes 的 Naïve Graph Description 有一张二分图 G(m)G(m)G(m),其中有 (m−1)(m - 1)(m−1) ...

最新文章

  1. 微软“影子系统”Windows SteadyState 末日将至
  2. java多线程的join方法_java多线程系列_join方法的使用(5)
  3. oracle查询最高一条记录,oracle 查询已有记录,上一条记录,下一条记录
  4. 基于CSMA -CA协议的无线星型网络的应用案例介绍
  5. js 事件学习与总结
  6. [Android学习笔记四] 自定义Android组件之组合方式创建密码框组件
  7. 在Keil中利用AStyle插件格式化代码
  8. ubuntu搭建时间同步服务器
  9. JTAG各类接口针脚定义及含义
  10. c语言家庭财务管理算法,c语言家庭财务管理报告.doc
  11. 小丸工具箱压制字幕注意
  12. 网页打开软件显示无法连接服务器,Safari 浏览器无法打开网页怎么办
  13. vue实现输入六位密码支付页面
  14. 数据挖掘 顶级期刊_SEER数据挖掘如果用上这些图会更好发
  15. Microsoft Completes Acquisition of Collaboration Software Provider Groove Networks
  16. 抑菌洗手液做MSDS中英文报告详细说明
  17. 鼎沐素食:还生命于自然,还身心于自己!
  18. C语言实现三子棋(五子棋可以改赢得函数即可)
  19. java毕业生设计斗南基地鲜花网上销售管理系统计算机源码+系统+mysql+调试部署+lw
  20. VirtuaNES.v0.97源码探究6 内存相关

热门文章

  1. Linux centos6 命令行配置网络连接
  2. java实现Execl中的STDEVP函数
  3. android studio快捷键与Eclipse快捷键对比-没有之一
  4. python 纵向输出字符串_Python(五)字符串
  5. oracle goldengate 触发器,Oracle goldengate的触发器错误 OGG-00869
  6. 连续竞价java_Java 方法method
  7. html 怎么几秒后自动隐藏,js设定DIV显示时间并动态显示时间倒计时多少秒,倒计时完了之后该层自动隐藏。...
  8. 手机可以和linux数据互传吗,没网络也可以传输数据?OPPO互传与HUAWEI Share实测体验...
  9. vs2015 ef 连接mysql_VS2015 + EF6连接MYSQL
  10. 快速排序的python实现