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

    不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...

  2. MySQL中时间函数NOW()和SYSDATE()的区别

    mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...

  3. 【nginx】nginx解决跨域详解

    使用场景:本地运行一个项目,但是要访问外域的api接口,存在跨域问题,解决方式有很多,但我尝试用nginx解决,搜索了网上文章后再加上尝试终于成功, 其中一些注意事项和大家分享一下. 一.window ...

  4. Android Studio 3.1 Beta 1发布,如何及时下载更新

    每次收到Android Studio更新提示,总是延迟一段时间才能下载的到或者更新成功.架梯子也不行.而且更新检测也是时断时续.Android Studio 3.0.1使用一段时间,多开几个工程.经常 ...

  5. 《Thinking in Java》学习笔记(五)

    1. Java异常补充 a.使用try/catch捕获了异常之后,catch之后的代码是会正常运行的,认为即使进行了异常捕获,出现了异常就不往下执行,这是很多新手会犯的错误. public class ...

  6. CF 570D. Tree Requests [dsu on tree]

    传送门 题意: 一棵树,询问某棵子树指定深度的点能否构成回文 当然不用dsu on tree也可以做 dsu on tree的话,维护当前每一个深度每种字母出现次数和字母数,我直接用了二进制.... ...

  7. HashMap----工作原理

    先来些简单的问题 "你用过HashMap吗?" "什么是HashMap?你为什么用到它?" 几乎每个人都会回答"是的",然后回答HashMa ...

  8. ubunt tftp服务器搭建

    默认安装的Ubuntu系统没有包含TFTP的服务端和客户端,可以通过命令行来下载安装,步骤如下: (1)安装客户端. root@ www.linuxidc.com:~# apt-get install ...

  9. OpenSSL 中DES-ECB 加密使用注意事项

    参考:http://blog.csdn.net/cparent/article/details/40652051DES加密算法作为一个过时的东西,使用的项目已经很少了.最近在调试与服务器端进行DES加 ...

  10. CSS3 @keyframes 用法(简单动画实现)

    定义: 通过 @keyframes 规则,能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,可以多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或 ...