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. Log4j扩展使用--输出地Appender

    OK,现在我们来研究输出低Appended. Appender控制日志输出的位置 Log4j日志系统允许把日志输出到不同的地方,如控制台(Console).文件(Files).根据天数或者文件大小产生 ...

  2. 转-Linux硬件装置和磁盘分区MBR

    1 各硬件装置在Linux中的文件名 『在Linux系统中,每个装置都被当成一个文件来对待』 举例来说,SATA接口的硬盘的文件名即为/dev/sd[a-d],其中, 括号内的字母为a-d当中的任意一 ...

  3. UUID.randomUUID().toString()

    UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法.UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机 ...

  4. 怎样查看MYSQL数据库的端口号

    show variables like '%port%';

  5. Linux三剑客之awk最佳实践

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 知识点: 记录与字段 模式匹配:模式与动作 基本的awk执行过程 awk常用内置变量(预定义变量) awk数组 a ...

  6. 小z的袜子

    传送门 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从 ...

  7. java基础(一) 深入解析基本类型

    .   浮点数使用 IEEE(电气和电子工程师协会)格式. 浮点数类型使用 符号位.指数.有效位数(尾数)来表示.要注意一下,尾数的最高 在java中,float 和 double 的结构如下: 类 ...

  8. [DeeplearningAI笔记]ML strategy_1_3可避免误差与改善模型方法

    机器学习策略 ML strategy 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.8 为什么是人的表现 今天,机器学习算法可以与人类水平的表现性能竞争,因为它们在很多应用程序中更有生产 ...

  9. c#结构体、打他table、excel、csv互转

    1.csv相关 public static class CsvHelper { /// <summary> /// 根据csv路径获取datatable /// </summary& ...

  10. [eslint-plugin-vue] [vue/no-unused-vars] 'scope' is defined but never used.

    前言 今天在做项目的时候Visual Studio Code报了一个错 这个错的意思是声明了scope却没有使用它,这是vue的eslink插件检测的. 我想这个scope的属性不是自己的吗,咋是我声 ...