Codeforces 446C DZY Loves Fibonacci Numbers [线段树,数论]

时间:2021-12-22 06:49:52

洛谷

Codeforces


思路

这题知道结论就是水题,不知道就是神仙题……

斐波那契数有这样一个性质:\(f_{n+m}=f_{n+1}f_m+f_{n}f_{m-1}\)。

至于怎么证明嘛……

即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。

反之亦然同理,推论自然成立,略去过程QED,由上可知证毕。

其实就是我不会

而且这个性质对于负数下标也是成立的。

负数下标的斐波那契数怎么求?你从\(f_{-1}+f_0=f_1\)可以得到\(f_{-1}=1\),后面的你也倒推回去就可以了,最后得到\(f_{-i}=(-1)^{i+1}f_i,i\geq 0\)。

回到本题。在一次\([l,r]\)的修改操作中,位置\(x\in[l,r]\)所加的值为\(f_{x-l+1}=f_{x+1}f_{1-l}+f_xf_{-l}\)

你发现可以用线段树维护,随便写写就过了。我才不告诉你我数组开小、没取模拼命WA呢。


代码

#include<bits/stdc++.h>
namespace my_std{
using namespace std;
#define pii pair<int,int>
#define fir first
#define sec second
#define MP make_pair
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define drep(i,x,y) for (int i=(x);i>=(y);i--)
#define go(x) for (int i=head[x];i;i=edge[i].nxt)
#define sz 303030
typedef long long ll;
const ll mod=1e9+9;
template<typename T>
inline void read(T& t)
{
t=0;char f=0,ch=getchar();
double d=0.1;
while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
if(ch=='.')
{
ch=getchar();
while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
}
t=(f?-t:t);
}
template<typename T,typename... Args>
inline void read(T& t,Args&... args){read(t); read(args...);}
void file()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
}
// inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std; int n,m;
int a[sz]; ll f[sz],ff[sz],F[sz];
void init()
{
F[1]=f[1]=1;
rep(i,2,sz-1) F[i]=(F[i-1]+(f[i]=(f[i-1]+f[i-2])%mod))%mod;
rep(i,1,sz-1) ff[i]=(i&1)?f[i]:mod-f[i];
} ll tg1[sz<<2],tg2[sz<<2],sum[sz<<2];
#define ls k<<1
#define rs k<<1|1
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define S int k,int l,int r
#define I inline
I void Add1(S,ll s){(tg1[k]+=s)%=mod;(sum[k]+=s*(F[r]-F[l-1]+mod)%mod)%=mod;}
I void Add2(S,ll s){(tg2[k]+=s)%=mod;(sum[k]+=s*(F[r+1]-F[l]+mod)%mod)%=mod;}
I void pushdown(S)
{
if (!tg1[k]&&!tg2[k]) return;
int mid=(l+r)>>1;
ll &t1=tg1[k],&t2=tg2[k];
Add1(lson,t1);Add1(rson,t1);
Add2(lson,t2);Add2(rson,t2);
t1=t2=0;
}
void pushup(int k){sum[k]=(sum[ls]+sum[rs])%mod;}
void add(S,int x,int y,ll s1,ll s2)
{
if (x<=l&&r<=y) return Add1(k,l,r,s1),Add2(k,l,r,s2);
pushdown(k,l,r);
int mid=(l+r)>>1;
if (x<=mid) add(lson,x,y,s1,s2);
if (y>mid) add(rson,x,y,s1,s2);
pushup(k);
}
ll query(S,int x,int y)
{
if (x<=l&&r<=y) return sum[k];
pushdown(k,l,r);
int mid=(l+r)>>1;
ll ret=0;
if (x<=mid) ret+=query(lson,x,y);
if (y>mid) ret+=query(rson,x,y);
return ret%mod;
}
void build(S)
{
if (l==r) return (void)(sum[k]=a[l]%mod);
int mid=(l+r)>>1;
build(lson);build(rson);
pushup(k);
} int main()
{
file();
int x,y,z;
read(n,m);
rep(i,1,n) read(a[i]);
init();
build(1,1,n);
while (m--)
{
read(z,x,y);
if (z==1) add(1,1,n,x,y,ff[x],ff[x-1]);
else printf("%lld\n",query(1,1,n,x,y));
}
return 0;
}

Codeforces 446C DZY Loves Fibonacci Numbers [线段树,数论]的更多相关文章

  1. ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers&lpar;线段树 &amp&semi;&amp&semi; 数论&rpar;

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

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

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

    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. Codeforces 446C —— DZY Loves Fibonacci Numbers(线段树)

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

  6. codeforces 446C DZY Loves Fibonacci Numbers 数论&plus;线段树成段更新

    DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d &a ...

  7. Codeforces 446C - DZY Loves Fibonacci Numbers(斐波那契数列&plus;线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 你可能会疑惑我为什么要写 *2400 的题的题解 首先一个很明显的想法是,看到斐波那契数列和 \(10^9+9\) 就想到通项公式,\(F ...

  8. CF446C DZY Loves Fibonacci Numbers 线段树 &plus; 数学

    有两个性质需要知道: $1.$ 对于任意的 $f[i]=f[i-1]+f[i-2]$ 的数列,都有 $f[i]=fib[i-2]\times f[1]+fib[i-1]\times f[2]$ 其中 ...

  9. Codeforces446C DZY Loves Fibonacci Numbers&lpar;线段树 or 分块?&rpar;

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

随机推荐

  1. SQL Sever无法打开链接对话框,未将对象引用设置到对象的实例。(AppIDPackage)

    前几天刚做完系统,先装的是SQL Sever2008,装完后还试了一下,OK~没问题,然后就继续装VS2012等一些软件.搞到很晚没有继续试试就睡了,第二天运行SSMS出问题了..(如图 1.0 所示 ...

  2. 学习Linux第七天

    1.shell echo $HOME 默认在shell中编写的变量全部是局部变量,如果重新打开console的话,那么这些变量将全部丢失,全局的变量可以写在文件~/.bashrc文件. 2.判断 !/ ...

  3. &lbrack;&period;NET Framework学习笔记&rsqb;一些概念

    CIL:Common Intermediate Language 公共中间语言 VB.NET 和 C#.NET 编译以后都生成相同的中间语言,程序集就是由CIL组成的,CIL代码也叫做托管代码,因为C ...

  4. Ext4中内存使用技巧的一点思考

           今天在分析Ext4文件系统的时候,看到两个函数ext4_kvzalloc()/ext4_kvfree(),想到以前在使用kzalloc()/kmalloc()带来的内存分配失败问题,不得 ...

  5. oracle ORA-02292&colon; 违反完整约束条件

    我是处于工作中没用过oracle的状态,这不,记录下这个小小的问题.哈哈. 表是公司的平台组定义的.前几天为了测试程序,想删掉一些记录,然后使用delete语句,出现这个东东:oracle ORA-0 ...

  6. &lbrack;Postman&rsqb;发出SOAP请求&lpar;18&rpar;

    使用Postman发出SOAP请求: 将SOAP端点作为URL.如果您使用的是WSDL,那么请将WSDL的路径作为URL. 将请求方法设置为POST. 打开原始编辑器,并将正文类型设置为“text / ...

  7. MyEclipse10中启动出现OutOfMemoryError&colon; PermGen space如何解决

    一篇关于技术的文档,分享给大家.在MyEclipse中启动程序运行,报错java.lang.OutOfMemoryError: PermGen space应该怎么办?这是eclipse 内存不够的原因 ...

  8. CH 2601 - 电路维修 - &lbrack;双端队列BFS&rsqb;

    题目链接:传送门 描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致 ...

  9. Nodejs的测试和测试驱动开发

    测试是保证软件质量必不可少的一环.测试有很多形式:手动.自动.单元测试等等.这里我们只聊使用Mocha这个框架在Nodejs中实现单元测试.单元测试是测试等重要组成,这样的测试只对于一个方法,这样的一 ...

  10. Linux系统配置VSFTP软件详解

    Linux系统配置VSFTP软件详解 出处 http://www.sudu.cn/service/detail.php?id=11656 vsftpd.conf 是vsftpd的配置文件,用来控制vs ...