CF446C DZY Loves Fibonacci Numbers 线段树 + 数学

code:

#include <bits/stdc++.h>
#define N 400004
#define LL long long
#define lson now<<1
#define rson now<<1|1
#define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
const LL mod=1000000009;
int n,m;
LL fib[N<<1],sum[N<<1];
struct node
{
	LL f1,f2,sum;
	int l,r,len;
}t[N<<2];
void build(int l,int r,int now)
{
	t[now].l=l;
	t[now].r=r;
	t[now].len=r-l+1;
	if(l==r) return ;
	int mid=(l+r)>>1;
	if(l<=mid)    build(l,mid,lson);
	if(r>mid)     build(mid+1,r,rson);
}
void mark(int now,LL f1,LL f2)
{
	(t[now].f1+=f1)%=mod;
	(t[now].f2+=f2)%=mod;
	(t[now].sum+=f1*fib[t[now].len]%mod+f2*fib[t[now].len+1]%mod-f2+mod)%=mod;
}
void pushup(int now)
{
	t[now].sum=(t[lson].sum+t[rson].sum)%mod;
}
void pushdown(int now)
{
	if(t[now].f1==0&&t[now].f2==0) return;
	int mid=(t[now].l+t[now].r)>>1;
	mark(lson,t[now].f1,t[now].f2);
	if(t[now].r>mid)
	mark(rson,t[now].f1*fib[t[lson].len-1]%mod+t[now].f2*fib[t[lson].len]%mod,t[now].f1*fib[t[lson].len]%mod+t[now].f2*fib[t[lson].len+1]%mod);
	t[now].f1=t[now].f2=0;
}
void update(int l,int r,int now,int L,int R)
{
	if(l>=L&&r<=R)
	{
		mark(now,fib[l-L+1],fib[l-L+2]);
		return;
	}
	pushdown(now);
	int mid=(l+r)>>1;
	if(L<=mid)     update(l,mid,lson,L,R);
	if(R>mid)      update(mid+1,r,rson,L,R);
	pushup(now);
}
LL query(int l,int r,int now,int L,int R)
{
	if(l>=L&&r<=R)
	{
		return t[now].sum;
	}
	pushdown(now);
	int mid=(l+r)>>1;
	LL re=0ll;
	if(L<=mid)    re+=query(l,mid,lson,L,R);
	if(R>mid)     re+=query(mid+1,r,rson,L,R);
	return re%mod;
}
int main()
{
	// setIO("input");
	int i,j;
	scanf("%d%d",&n,&m);
	fib[1]=fib[2]=1;
	for(i=3;i<N;++i)    fib[i]=(fib[i-1]+fib[i-2])%mod;
	for(i=1;i<=n;++i)    scanf("%lld",&sum[i]), (sum[i]+=sum[i-1])%=mod;
	build(1,n,1);
	for(i=1;i<=m;++i)
	{
		int opt,l,r;
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==1) update(1,n,1,l,r);
		else printf("%lld\n",(query(1,n,1,l,r)+sum[r]-sum[l-1]+mod*2)%mod);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/11798397.html

时间: 2024-11-12 07:32:40

CF446C DZY Loves Fibonacci Numbers 线段树 + 数学的相关文章

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

第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要用的时候可以枚举一下,把这些参数求出来之后就题目就可以转化为维护等比数列. 由于前面的常数可以最后乘,所以就等于维护两个等比数列好了. 下面我们来看如何维护一个等比数列.假如我对区间[L,R]的加上1,2,4,8...2^n的话,那么我只需要加一个标记x表示这个区间被加了多少次这样的2^n. 举个例

codeforces 446C DZY Loves Fibonacci Numbers 线段树

假如F[1] = a, F[2] = B, F[n] = F[n - 1] + F[n - 2]. 写成矩阵表示形式可以很快发现F[n] = f[n - 1] * b + f[n - 2] * a. f[n] 是斐波那契数列 也就是我们如果知道一段区间的前两个数增加了多少,可以很快计算出这段区间的第k个数增加了多少 通过简单的公式叠加也能求和 F[n]  = f[n - 1] * b + f[n - 2] * a F[n - 1] = f[n - 2] * b + f[n - 3] * a ..

codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)

In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 = 1; F2 = 1; Fn = Fn - 1 + Fn - 2 (n > 2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of n integers: a1, a2, ...,

codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-14) Description In mathematical terms, the sequence Fn of Fibonacci numbers is defi

Codeforces446C - DZY Loves Fibonacci Numbers

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\)且满足

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

E  DZY Loves Fibonacci Numbers In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1?=?1; F2?=?1; Fn?=?Fn?-?1?+?Fn?-?2 (n?>?2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consist

Codeforces 444C DZY Loves Colors 水线段树

题目链接:点击打开链接 水.. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set> #include <vector> #include <map> using namespace std; #define ll long long #defi

【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)

Description ? 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solution ? 先来考虑一段斐波那契数列如何快速求和,根据性质有 \[ \begin {align} fib_n &= fib_{n - 1} + fib_{n - 2} \ &= fib_ {n - 2} + fib_{n - 3} + fib_{n - 2} \ &= fib_{n -

Codeforces Round #FF (Div. 2) E. DZY Loves Fibonacci Numbers(斐波那契的定理+线段树)

/* 充分利用了菲波那切数列的两条定理: ①定义F[1] = a, F[2] = b, F[n] = F[n - 1] + F[n - 2](n≥3). 有F[n] = b * fib[n - 1] + a * fib[n - 2](n≥3),其中fib[i]为斐波那契数列的第 i 项. ②定义F[1] = a, F[2] = b, F[n] = F[n - 1] + F[n - 2](n≥3). 有F[1] + F[2] + -- + F[n] = F[n + 2] - b 这题还有一个事实,