首页 > 其他分享 >CF1634F Fibonacci Additions

CF1634F Fibonacci Additions

时间:2024-04-24 13:11:07浏览次数:27  
标签:CF1634F tmp cnt ch int del Fibonacci Additions mod

Statement:

给出两个长度为 \(n\) 的序列 \(a,b\),每次在 \(a\) 或 \(b\) 上 \([l,r]\) 操作,一次操作将会使 \([l,r]\) 中的数分别加上 \(fib[1],fib[2]...,fib[r - l + 1]\),每次操作完询问 \(a,b\) 是否在模 \(mod\) 意义下相等。

Solution:

先简化问题,令 \(c_i = a_i -b_i\),问题转化为每次操作完,\(c_i\) 是否全 \(0\).

其实这个问题可以直接上线段树解决。

但是我们考虑将区间操作转化为单点操作,有什么技巧可以实现呢? 差分!

差分的本质,其实是因为相邻项的增量有一定关系,根据关系设计出一个递推式,并且将区间转化为几个点的调整。

我们的增量 \(del\) 数组有这样的关系:\(del[i] = del[i - 1] + del[i - 2]\)。移项得到 \(del[i] - del[i - 1] - del[i - 2] = 0\),于是 \(del[i] - del[i - 1] - del[i - 2]\) 其实就是不变量。

于是我们设计差分数组 \(d[i] = c[i] - c[i - 1] - c[i - 2]\)。

分析操作带来的影响(这里分析 \(A\) 数组):

首先对于 \(d_l\) 显然需要 \(+f[1]\),\(d_{r+1}\) 因为 \(c_{r+1}\) 不变,所以 \(-f_{r-l + 2}\),\(d_{r+2}\) 同时也要 \(-f_{r - l + 1}\).

Code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int N = 3e5 + 1145;

int n, q, mod, a[N], b[N], c[N], d[N], f[N], cnt;

void ch(int x, int ad){
	if(x > n || x < 1) return;
	int tmp = (d[x] + (ad % mod + mod) % mod) % mod;
	if(d[x] == 0 && tmp) cnt--;
	else if(d[x] != 0 && (!tmp)) cnt++; 
	d[x] = tmp;  
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);	
	cin >> n >> q >> mod;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = 1; i <= n; i++) cin >> b[i];
	f[1] = f[2] = 1;
	for(int i = 3; i <= n + 114; i++) f[i] = (f[i - 1] + f[i - 2]) % mod;
	for(int i = 1; i <= n; i++) c[i] = (a[i] - b[i] + mod) % mod, d[i] = ((c[i] - c[i - 1] - c[max(0ll, i - 2)]) + mod) % mod, ch(i, 0), cnt += (d[i] == 0);
	while(q--){
		char c; int l, r; cin >> c >> l >> r;
		if(c == 'A'){
			ch(l, f[1]); ch(r + 1, -f[r - l + 2]); ch(r + 2, -f[r - l + 1]);
		}
		else{
			ch(l, -f[1]); ch(r + 1, f[r - l + 2]); ch(r + 2, f[r - l + 1]);
		}
		if(cnt == n) cout << "YES" << "\n";
		else cout << "No" << "\n"; 
	}
	
	return 0;
}
/*
c[i] = a[i] - b[i]
d[i] = c[i] - c[i - 1] - c[i - 2]
*/

标签:CF1634F,tmp,cnt,ch,int,del,Fibonacci,Additions,mod
From: https://www.cnblogs.com/little-corn/p/18155062

相关文章

  • 6-1 使用函数输出指定范围内Fibonacci数的个数
    本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,fib(0)=fib(1)=1。其中函数fib(n)须返回第n项Fibonacci数;函数Prin......
  • 蓝桥杯 试题 基础练习 Fibonacci数列
    问题描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要......
  • QOJ #1280.Fibonacci Partition/Fibonacci性质大杂烩
    QOJ#1280.FibonacciPartition(为什么布置的作业题没有任何可见AC记录啊/kk)拿下了QOJ上的用户首杀(同时目前也是QOJ可见的submission中唯一一个过掉这个题的,另一个是vjudge上我的提交)。也许是这个题实在是太冷门了,但是从Fibonacci-Lucas数列的性质应用上是一道非常......
  • Fibonacci
    Fibonacci思路可以发现,连续的三个字母不全相同,所以|s|\(\le\)3*|t||S|枚举一下即可(好像能证明但是不会),1e6左右所以只要暴力算出来一段S,然后枚举起点开始匹配即可40分\(O(|S|*|s|)\)枚举即可100分使用类似倍增的方法st[i][j]表示从t[i]......
  • 佳佳的 Fibonacci
    和lyh想的差不多,我认为我写的会更详细一些。dyc好厉害。完全想不到这样的做法。给你两个整数\(n\),\(m\),让你求以下式子的值。\[T(n)=\sum_{i=1}^{n}f(i)\timesi\bmodm\]对于斐波那契数列\(f(n)=f(n-1)+f(n-2)\)这样的性质,使用前缀和化简式子是个好东西。式子就变......
  • Fibonacci
    #1.Recursionslowdeffibonacci_recursion(n):ifn<=1:returnnelse:returnfibonacci_recursion(n-1)+fibonacci_recursion(n-2)#2.Listsaveeveryvalue,avoidrepeatecomputefastdeffibonacci_list(n):F=[0,1]if......
  • Fibonacci数列
    1.Fibonacci数列-蓝桥云课(lanqiao.cn)题目描述:Fibonacci数列:第1、2项均为1,从第3项开始,每一项都是前两项之和。输入n值,输出Fibonacci数列第n项,该数列前10项为1,1,2,3,5,8,13,21,34,55。输入描述:输入占一行,为n的值,1sns40。输出描述:输出占一行,为Fibonacci数列第n项......
  • 佳佳的 Fibonacci
    题面\(f_x=\begin{cases}1&x\in\{1,2\}\\f_{x-1}+f_{x-2}&x\geq3\\\end{cases}\)求\(1\timesf_1+2\timesf_2+3\timesf_3+…+n\timesf_n\)。解法正常的Fibonacci前n项和\(loj\)如果卡死了用这个:Fibonac......
  • P9825 [ICPC2020 Shanghai R] Fibonacci
    原题链接题解直观的\(O(n)\)算法很容易想到,但是很不幸,挂了所以我们要想到\(O(1)\)的做法考虑到斐波那契数列非常有规律,所以我们找找规律奇,奇,偶,奇,奇,偶。。。code#include<bits/stdc++.h>usingnamespacestd;#definelllonglonglla[5]={0};intmain(){lln......
  • CF1264F Beautiful Fibonacci Problem
    一道比较Beautiful的结论题,初始感觉难以下手,做了后认为在CF3500中不算很难的(逃看到题目中“后18位的子串”,很明显的,我们要求一下Fibonacci数列${mod}10^k$的循环节。实践打表证明这个循环节为$1.5*10^k$但是我们需要一个随Fibonacci下标线性增加,$mod10^k$的值也线性增加的......