Portal

Description

给出一个\(n(n\leq3\times10^5)\)个数的序列,进行\(m(m\leq3\times10^5)\)次操作,操作有两种:

  • 给区间\([L,R]\)加上一个斐波那契数列,即\(\{a_L,a_{L+1},...,a_R\} \rightarrow \{a_L+F_1,a_{L+1}+F_2,...,a_R+F_{R-L+1}\}\)
  • 询问区间\([L,R]\)的和,对\(10^9+9\)取模。

    斐波那契数列:\(F_1=1,F_2=2\)且满足\(F_{n+2}=F_n+F_{n+1}\)。

Solution

容易知道,满足\(a_{n+2}=a_n+a_{n+1}\)的数列具有以下性质:

  • 若\(c_n=a_n+b_n\),则\(c_1=a_1+b_1,c_2=a_2+b_2,c_{n+2}=c_n+c_{n+1}\)。
  • 有通项公式\(a_n=F_{n-2}a_1+F_{n-1}a_2\)。
  • 有前缀和公式\(\sum_{i=1}^n a_i=a_{n+2}-a_2\)。

    下面依次进行证明。

    证明1

    \(c_{n+2}=a_{n+2}+b_{n+2}=(a_n+a_{n+1})+(b_n+b_{n+1})=(a_n+b_n)+(a_{n+1}+b_{n+1})=c_n+c_{n+1}\)

    证明2

    若当\(n\leq k\)时,\(a_n=F_{n-2}a_1+F_{n-1}a_2\),则

    \(a_{k+1}=a_{k-1}+a_k=(F_{k-3}a_1+F_{k-2}a_2)+(F_{k-2}a_1+F_{k-1}a_2)=F_{k-1}a_1+F_ka_2\)

    因为\(a_1=F_{-1}a_1+F_0\)(可以认为\(F_0=F_2-F_1=0,F_{-1}=F_1-F_0=1\)),\(a_2=F_0a_1+F_1a_2\)

    所以\(\forall n\in\mathbb{Z},a_n=F_{n-2}a_1+F_{n-1}a_2\)。

    证明3

    \(\begin{align} 2\Sigma_{i=1}^n a_i &= (a_1+a_2+...+a_n)+(a_1+a_2+...+a_n) \\ &=a_1+(a_1+a_2)+(a_2+a_3)+...+(a_{n-1}+a_n)+a_n \\ &=a_1+a_n+(a_3+a_4...+a_{n+1}) \\ &=(a_1+a_2+...+a_n)-a_2+a_n+a_{n+1} \\ &=\Sigma_{i=1}^n a_i+a_{n+2}-a_2 \\ \Sigma_{i=1}^n a_i &=a_{n+2}-a_2 \end{align}\)

    我们现在就可以用线段树维护这个序列了。线段树中的每个节点记录三个值\(f_1,f_2,sum\),表示该区间被加上了一个以\(f_1,f_2\)开头的数列,区间和为\(sum\)。

    通过性质1,我们知道\(f_1,f_2\)可以叠加;

    通过性质2,我们可以\(O(1)\)地将\(f_1,f_2\)下放;

    通过性质3,我们可以\(O(1)\)地更新\(sum\)。

    时间复杂度\(O(nlogn)\)。

Code

//DZY Loves Fibonacci Numbers
#include <cstdio>
inline char gc()
{
    static char now[1<<16],*S,*T;
    if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
    return *S++;
}
inline int read()
{
    int x=0,f=1; char ch=gc();
    while(ch<'0'||'9'<ch) {if(ch=='-') f=-1; ch=gc();}
    while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
typedef long long lint;
int const N=3e5+10;
lint const P=1e9+9;
int n,m; lint F[N],a[N];
#define s sg[s0]
struct seg{lint f1,f2,sum;} sg[N*20];
void update(int s0,int len)
{
    s.f1%=P,s.f2%=P;
    s.sum=sg[s0<<1].sum+sg[s0<<1|1].sum+(s.f1*F[len]+s.f2*F[len+1]-s.f2),s.sum%=P;
}
void pushdown(int s0,int L0,int R0)
{
    if(s.f1==0&&s.f2==0) return;
    int mid=L0+R0>>1,Ls0=s0<<1,Rs0=Ls0|1;
    sg[Ls0].f1+=s.f1; sg[Rs0].f1+=s.f1*F[mid-L0]+s.f2*F[mid-L0+1];
    sg[Ls0].f2+=s.f2; sg[Rs0].f2+=s.f1*F[mid-L0+1]+s.f2*F[mid-L0+2];
    s.f1=s.f2=0;
    update(Ls0,mid-L0+1); update(Rs0,R0-mid);
}
void ins(int s0,int L0,int R0,int L,int R)
{
    if(L<=L0&&R0<=R) {s.f1+=F[L0-L+1],s.f2+=F[L0-L+2],update(s0,R0-L0+1); return;}
    pushdown(s0,L0,R0);
    int mid=L0+R0>>1;
    if(L<=mid) ins(s0<<1,L0,mid,L,R);
    if(mid<R) ins(s0<<1|1,mid+1,R0,L,R);
    update(s0,R0-L0+1);
}
lint query(int s0,int L0,int R0,int L,int R)
{
    if(L<=L0&&R0<=R) return s.sum;
    pushdown(s0,L0,R0);
    lint res=0; int mid=L0+R0>>1;
    if(L<=mid) res+=query(s0<<1,L0,mid,L,R);
    if(mid<R) res+=query(s0<<1|1,mid+1,R0,L,R);
    return res%P;
}
lint sumA[N];
int main()
{
    n=read(),m=read();
    F[1]=F[2]=1; for(int i=3;i<=n+1;i++) F[i]=(F[i-2]+F[i-1])%P;
    for(int i=1;i<=n;i++) a[i]=read(),sumA[i]=sumA[i-1]+a[i];
    int rt=1;
    for(int i=1;i<=m;i++)
    {
        int opt=read(),L=read(),R=read();
        if(opt==1) ins(rt,1,n,L,R);
        else printf("%lld\n",(query(rt,1,n,L,R)+sumA[R]-sumA[L-1])%P);
    }
    return 0;
}

P.S.

CF怎么是个题就要开long long!?

不知道为什么要求对\(10^9+9\)取模,而不是\(10^9+7\)。

Codeforces446C - DZY Loves Fibonacci Numbers的更多相关文章

  1. 『题解』Codeforces446C DZY Loves Fibonacci Numbers

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description In mathematical terms, the sequence \( ...

  2. Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)

    第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...

  3. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)

    In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 ...

  4. 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 ...

  5. cf446C DZY Loves Fibonacci Numbers

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

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

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

  7. [CodeForces - 447E] E - DZY Loves Fibonacci Numbers

    E  DZY Loves Fibonacci Numbers In mathematical terms, the sequence Fn of Fibonacci numbers is define ...

  8. ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 && 数论)

    Description In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence ...

  9. 【思维题 线段树】cf446C. DZY Loves Fibonacci Numbers

    我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...

随机推荐

  1. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  2. django的rest_framework框架源码剖析

    在看源码之前先了解一下什么是rest,restful api. 什么是rest 可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则. REST是Representational S ...

  3. SQL explain详细结果

    explain 的结果 id select_type 查询的序列号 select_type simple (不含子查询) primary (含子查询.或者派生查询) subquery (非from子查 ...

  4. 分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中

    今天学习分析ajax 请求,现把学得记录, 把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件, ...

  5. Oracle 12cR1 RAC 在VMware Workstation上安装(下)—静默安装

    Oracle 12cR1 RAC 在VMware Workstation上安装(下)—静默安装 1.1  静默安装 1.1.1  静默安装grid 安装之前使用脚本进行校验,确保所有的failed选项 ...

  6. ant基础[转]

    原文链接:http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html 1,什么是antant是构建工具2,什么是构建概念到处可查到 ...

  7. POJ 1625 Censored! [AC自动机 高精度]

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9793   Accepted: 2686 Descrip ...

  8. POJ 2826 An Easy Problem?![线段]

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12970   Accepted: 199 ...

  9. XML实体解析器的作用

    XML实体解析器的作用 什么是实体解析器 如果一个sax解析器需要实现对外部实体的自定义处理,那么必须实现一个EntityResolver接口并且注册到SAX驱动上. 从这段文字可以看出来,实体解析器 ...

  10. Hadoop源码分类概要整理

    最近突然觉得, 很多掌握的都还是很浅的原理,需要更深入细粒度去了解整个分布式系统的运转机制.于是..开始作死而又作死而又作死的源码之旅. Hadoop包的功能总共有下列几类: tool:提供一些命令行 ...