Description:

给出一个数列,每次可以选取一个区间,按顺序加上第i个Fibonacci Numbers(斐波那契数)进行更新,也可以查询某一个区间的总和。

Hint:

\(n \le 3*10^5\)

Solution:

数据结构结合数学

首先有公式 \(\sum _{i=1}^n fib(i)=fib(n+2)\)

且由于斐波那契的递推是线性的,故所有的\(fib(i)\)都可以表示成\(a*fib(1)+b*fib(2)\)的形式

考虑用线段树维护一个区间前两个位置的系数,然后就可以做了

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const ll mxn=1e6+5,mod=1e9+9;
ll n,m,cnt,a[mxn],hd[mxn];
ll f[mxn],tr[mxn<<2],vis[mxn<<2],tag[mxn<<2][2];inline ll read() {char c=getchar(); ll x=0,f=1;while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}return x*f;
}
inline void chkmax(ll &x,ll y) {if(x<y) x=y;}
inline void chkmin(ll &x,ll y) {if(x>y) x=y;}struct ed {ll to,nxt;
}t[mxn<<1];inline void add(ll u,ll v) {t[++cnt]=(ed) {v,hd[u]}; hd[u]=cnt;
}void push_up(ll p) {tr[p]=(tr[ls]+tr[rs])%mod;
}struct ST {ll x,y;
};ST fibget(ST tp,ll len) {ll c=tp.x*f[len]%mod+tp.y*f[len+1]%mod,d=tp.x*f[len+1]%mod+tp.y*f[len+2]%mod;return (ST) {c%mod,d%mod};
}ll fibcal(ll f1,ll f2,ll len) {ll res=0;if(len>=1) res=f1;if(len>=2) res=(res+f2)%mod;if(len>=3) res=(res+f2*(f[len+1]-2)%mod+f1*(f[len]-1)%mod+mod)%mod;//前两项的系数的值,直接乘以当前f[i+1],f[i],计算出f[i+2]return res;
}void push_down(ll p,ll l,ll r) {ll mid=(l+r)>>1;if(vis[p]) {ll &a=tag[p][0],&b=tag[p][1];tag[ls][0]=(tag[ls][0]+a)%mod;tag[ls][1]=(tag[ls][1]+b)%mod;tr[ls]=(tr[ls]+fibcal(a,b,mid-l+1))%mod;vis[ls]=1;ll c=a*f[mid-l]+b*f[mid-l+1],d=a*f[mid-l+1]+b*f[mid-l+2];c%=mod; d%=mod;tag[rs][0]=(tag[rs][0]+c)%mod;tag[rs][1]=(tag[rs][1]+d)%mod;tr[rs]=(tr[rs]+fibcal(c,d,r-mid))%mod;vis[rs]=1;vis[p]=tag[p][0]=tag[p][1]=0;}
}void build(ll l,ll r,ll p) {if(l==r) {tr[p]=a[l]; return ;}ll mid=(l+r)>>1;build(l,mid,ls); build(mid+1,r,rs); push_up(p);
}void modify(ll l,ll r,ll ql,ll qr,ll val1,ll val2,ll p) {if(ql<=l&&r<=qr) {tag[p][0]=(tag[p][0]+val1)%mod;tag[p][1]=(tag[p][1]+val2)%mod;tr[p]=(tr[p]+fibcal(val1,val2,r-l+1))%mod;vis[p]=1; return ;}ll mid=(l+r)>>1; push_down(p,l,r);if(qr<=mid) modify(l,mid,ql,qr,val1,val2,ls);else if(ql>mid) modify(mid+1,r,ql,qr,val1,val2,rs);else {modify(l,mid,ql,qr,val1,val2,ls);ST z=fibget((ST){val1,val2},mid-ql);modify(mid+1,r,mid+1/*询问区间也要更改*/,qr,z.x,z.y,rs); //算出区间前两个fib,貌似也可以用前缀和}push_up(p);
}ll query(ll l,ll r,ll ql,ll qr,ll p) {if(ql<=l&&r<=qr) return tr[p];ll mid=(l+r)>>1; push_down(p,l,r); ll res=0;if(ql<=mid) res=(res+query(l,mid,ql,qr,ls))%mod;if(qr>mid) res=(res+query(mid+1,r,ql,qr,rs))%mod;return res;
}void init() {n=read(); m=read(); ll x,y,opt; f[1]=f[2]=1; for(ll i=3;i<=n+4;++i) f[i]=(f[i-1]+f[i-2])%mod;for(ll i=1;i<=n;++i) a[i]=read()%mod; build(1,n,1);for(ll i=1;i<=m;++i) {opt=read(); x=read(); y=read();if(opt==1) modify(1,n,x,y,1,1,1);else printf("%lld\n",(query(1,n,x,y,1)+mod)%mod);}
}int main()
{init();return 0;
}

转载于:https://www.cnblogs.com/list1/p/10569701.html

[CF446C]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 Round #FF 446 C. DZY Loves Fibonacci Numbers

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

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

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

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

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

  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. CF A. DZY Loves Hash

    A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. hdu-5645 DZY Loves Balls(水题)

    题目链接: DZY Loves Balls Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 262144/262144 K (Java ...

  9. CF447A DZY Loves Hash 模拟

    CF447A DZY Loves Hash 模拟 DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to ...

最新文章

  1. tensorflow2:tf.app.run()
  2. (Java)关于泛型
  3. python安装sqlite3_Python安装sqlite3
  4. 小学计算机试教教案,小学信息技术人教版三年级下册第7课《轻轻松松来上网》优质课公开课教案教师资格证面试试讲教案...
  5. springboot 权限管理 后台框架源码 java 项目 shiro FHAddmin
  6. 在阿里云服务器上安装docker
  7. IOS上 关于状态栏的相关设置(UIStatusBar)和preferredStatusBarStyle不执行问题
  8. 测试工具之badboy
  9. netcore docker_让.NetCore程序跑在任何有docker的地方
  10. 位运算java_Java中的位运算
  11. 2019央视春晚公布主持阵容 语言类节目将有突破
  12. linux 文件查找帮助命令 , 查看网络链接信息, 历史命令
  13. 英雄联盟登陆服务器显示外文,英雄联盟手游进不去出现英文怎么办 进不去出现英文解决方法[多图]...
  14. 算法与产品:抖音、快手的“气质”成因
  15. 深入React v16新特性(二)
  16. elementUI 选择器 html
  17. 中小企业如何选择进销存软件?
  18. Magento通过Paypal支付方式付款发送订单确认邮件
  19. 工作交接checklist
  20. 学习OpenCV3:判断两条直线平行,并计算平行距离

热门文章

  1. SAP WebIDE 里的 neo-app.json 文件用途
  2. SAP UI5加载xml视图的全过程
  3. ensp路由器无法启动_ensp和CRT使用小技巧
  4. 医学图像处理期末复习(二)
  5. Servlet的快速入门以及执行原理
  6. 【测评】PaMu Unique真无线蓝牙耳机,国潮新时尚,年轻人的标配
  7. redhat5 oracle11g安装全程详解,RedHat5+Oracle11g安装全程详解.doc
  8. mvc模式缺点 php,mvc模式有哪些优缺点
  9. RabbitMQ和Kafka的区别
  10. mysql实例化_MySQL如何通过实例化对象参数查询数据 ?(源代码)