题意: q q q次操作,每次给数组 A A A或者 B B B的 [ l , r ] [l,r] [l,r]位置加上一个斐波那契数列,问每次操作之后 A B AB AB数组是否相同
考虑斐波那契的生成函数
f ( x ) = 1 + 1 x + 2 x 2 + . . . + f i b i − 1 x i + . . . = ∑ i = 0 f i b i + 1 x i x f ( x ) = ∑ i = 1 f i b i x i , x 2 f ( x ) = ∑ i = 2 f i b i − 1 x i f ( x ) − x f ( x ) − x 2 f ( x ) = 1 f ( x ) = 1 1 − x − x 2 f(x)=1+1x+2x^2+...+fib_{i-1}x^i+...=\sum_{i=0}fib_{i+1}x^i\\ xf(x)=\sum_{i=1}fib_{i}x^i,x^2f(x)=\sum_{i=2}fib_{i-1}x^i\\ f(x)-xf(x)-x^2f(x)=1\\ f(x)=\frac 1 {1-x-x^2} f(x)=1+1x+2x2+...+fibi−1​xi+...=i=0∑​fibi+1​xixf(x)=i=1∑​fibi​xi,x2f(x)=i=2∑​fibi−1​xif(x)−xf(x)−x2f(x)=1f(x)=1−x−x21​
如果把 A , B A,B A,B看做两个多项式
A ( x ) = ∑ i = 1 n a i x i B ( x ) = ∑ i = 1 n b i x i A(x)=\sum_{i=1}^{n}a_ix^i\\ B(x)=\sum_{i=1}^{n}b_ix^i A(x)=i=1∑n​ai​xiB(x)=i=1∑n​bi​xi
那么在 A A A数组 [ l , r ] [l,r] [l,r]位置加上一个斐波那契数列就相当于
A ( x ) + = x l f ( x ) − f i b r − l + 2 x r f ( x ) − f i b r − l + 1 x r + 1 f ( x ) ⟺ A ( x ) + = x l 1 1 − x − x 2 − f i b r − l + 2 x r 1 1 − x − x 2 − f i b r − l + 1 x r + 1 1 1 − x − x 2 A(x)+=x^lf(x)-fib_{r-l+2}x^rf(x)-fib_{r-l+1}x^{r+1}f(x)\\ \iff A(x)+=x^l\frac 1 {1-x-x^2}-fib_{r-l+2}x^r\frac 1 {1-x-x^2}-fib_{r-l+1}x^{r+1}\frac 1 {1-x-x^2} A(x)+=xlf(x)−fibr−l+2​xrf(x)−fibr−l+1​xr+1f(x)⟺A(x)+=xl1−x−x21​−fibr−l+2​xr1−x−x21​−fibr−l+1​xr+11−x−x21​
两边同乘 ( 1 − x − x 2 ) (1-x-x^2) (1−x−x2)
⟺ ( 1 − x − x 2 ) A ( x ) + = x l − f i b r − l + 2 x r − f i b r − l + 1 x r + 1 \iff (1-x-x^2)A(x)+=x^l-fib_{r-l+2}x^r-fib_{r-l+1}x^{r+1} ⟺(1−x−x2)A(x)+=xl−fibr−l+2​xr−fibr−l+1​xr+1
每次修改复杂度就降为 O ( 1 ) O(1) O(1)
然后考虑 ( 1 − x − x 2 ) A ( x ) (1-x-x^2)A(x) (1−x−x2)A(x)的实际意义,即构造一个辅助数组 D D D
D i = A i − A i − 1 − A i − 2 D_i=A_i-A_{i-1}-A_{i-2} Di​=Ai​−Ai−1​−Ai−2​

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{int n,q,mod;scanf("%d%d%d",&n,&q,&mod);vector<int>a(n+1),b(n+1);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);for(int i=n;i>=2;i--){a[i]-=a[i-1]+a[i-2];a[i]=(a[i]%mod+mod)%mod;}for(int i=n;i>=2;i--){b[i]-=b[i-1]+b[i-2];b[i]=(b[i]%mod+mod)%mod;}int cnt=0;for(int i=1;i<=n;i++)cnt+=(a[i]!=b[i]);vector<int>fib(n+5);fib[1]=1%mod;fib[2]=1%mod;for(int i=3;i<=n;i++)fib[i]=(fib[i-1]+fib[i-2])%mod;// printf("cnt=%d\n",cnt);// for(int j=1;j<=n;j++)printf("%d%c",a[j]," \n"[j==n]);// for(int j=1;j<=n;j++)printf("%d%c",b[j]," \n"[j==n]);for(int i=1;i<=q;i++){char c[2];scanf("%s",c);int l,r;scanf("%d%d",&l,&r);auto add=[&](int id,int pos,int add){// printf("id=%d pos=%d add=%d\n",id,pos,add);if(pos>n)return;if(id==1){cnt-=(a[pos]!=b[pos]);a[pos]+=add;a[pos]=(a[pos]%mod+mod)%mod;cnt+=(a[pos]!=b[pos]);}else{cnt-=(a[pos]!=b[pos]);b[pos]+=add;b[pos]=(b[pos]%mod+mod)%mod;cnt+=(a[pos]!=b[pos]);}};if(c[0]=='A'){add(1,l,1);add(1,r+1,-fib[r-l+2]);add(1,r+2,-fib[r-l+1]);}else{add(2,l,1);add(2,r+1,-fib[r-l+2]);add(2,r+2,-fib[r-l+1]);}// printf("q=%d cnt=%d\n",i,cnt);// for(int j=1;j<=n;j++)printf("%d%c",a[j]," \n"[j==n]);// for(int j=1;j<=n;j++)printf("%d%c",b[j]," \n"[j==n]);if(cnt==0)printf("YES\n");else printf("NO\n");}   return  0;
}

CF1634 F. Fibonacci Additions相关推荐

  1. codeforces F.Fibonacci String Subsequences

    题意 定义F(x)为F(x-1)与F(x-2)的连接(其中F(0) = '0',F(1) = '1'). 给出一个长度不超过100的字符串s,询问s在F(x)的所有子序列中出现了多少次. 题解 数量很 ...

  2. 用Python编写斐波那契数列(Fibonacci Sequence)

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  3. Python学习笔记3 流程控制、迭代器、生成器

    第3章 流程控制.迭代器.生成器 3.1 选择语句 1.语法:(1)if -else (2)if-elif-else 2.注意:(1)每个条件后面要使用冒号:(2)使用缩进划分语句块(3)python ...

  4. Python高级特性:切片、迭代、列表生成式、生成器与迭代器

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 接着廖雪峰老师的学习教程,小编要开始加快推进Python的学习进程 ...

  5. Python3 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  6. 斐波那契数列的低效与高效解法 【转】

    文章来自:http://blog.csdn.net/mshantingting/article/details/22689573 斐波那契数列(又名黄金分割数列)在数学上的定义如下: 许多人包括作者自 ...

  7. 斐波那契的数列的计算python-python斐波那契数列的计算方法

    题目: 计算斐波那契数列.具体什么是斐波那契数列,那就是0,1,1,2,3,5,8,13,21,34,55,89,144,233. 要求: 时间复杂度尽可能少 分析: 给出了三种方法: 方法1:递归的 ...

  8. python基础——迭代器与生成器

    迭代是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退. 迭代器有两个基本的方法:iter( ...

  9. 【Python基础】Python高级特性:切片、迭代、列表生成式、生成器与迭代器

    接着廖雪峰老师的学习教程,小编要开始加快推进Python的学习进程了.今天的笔记内容是Python高级特性,其中包括快速访问对象类型元素的切片.循环中的迭代意义.方便的列表生成式操作以及生成器和迭代器 ...

最新文章

  1. linux驱动:TI+DM8127+GPIO(一)之应用——报警输入输出
  2. 解决不同操作系统下git换行符一致性问题
  3. g4e基础篇#6 了解Git历史记录
  4. C/C++中的占位符
  5. Android的Dalvik虚拟机的一个小BUG
  6. 高保真原型、动画引导、用户登录、巡检任务、维保任务、用户中心、历史记录、帮助中心、清除缓存、任务抽检、扫描二维码、待办事项、账号设置、客服信息、交互说明、手机端、小程序、app原型、BIM信息综合管理
  7. RabbitMQ死信队列应用场景之模拟未支付订单自动取消
  8. 【3ds Max】FractureVoronoi碎裂插件生成破碎物体
  9. android rat工具,Android远程控制工具——AndroRat
  10. 全球电动汽车电池隔膜行业调研及趋势分析报告
  11. 计算机网络的组成有哪些
  12. 服务器cpu型号知识普及,小白进阶教程 十个问题看懂CPU该如何选
  13. 完整版代码(亲测可用),给网站加上访客统计—你是第位访客
  14. 浅谈中国电信出口网络的链路情况(什么是 ChinaNet,CN2,GT,GIA)
  15. 四、nginx访问控制
  16. 四五线城市可以做什么项目?
  17. php使用addons,GitHub - yuninf/tp5-addons: ThinkPHP addons autoload
  18. 【我的Android进阶之旅】Android 混淆文件资源分类整理之二:将混淆文件拆分成更小粒度的混淆文件
  19. Python发邮件时报错 554
  20. 1.1「Motoko——Basic concepts and terms Mutable state」

热门文章

  1. typescript-json-schema 和 ajv 检测数据是否符合指定的ts类型
  2. npm WARN ajv-keywords@2.1.1 requires a peer of ajv(已解决)
  3. 【动态代理】CGLIB 动态代理的使用及原理
  4. QML控件类型:Dial
  5. spring中轻松实现定时任务,quartz表达式的在线Cron表达式生成器推荐
  6. Shell编程之免交互(Here Document、Expect(直接与嵌入执行))
  7. 学会共情让你的设计更走心
  8. DR-CAN的动态系统建模与分析学习笔记(3)拉普拉斯变换的收敛域(ROC)与逆变换(ILT)
  9. csapp大作业程序人生-Hello’s P2P
  10. QT中调佣FindWindow返回空值