Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】

2024-08-24 11:38

本文主要是介绍Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为  si 为近似周期序列,而且告诉你了 m 个位置以及数字。
那么就将序列分成m段,每一段用一个ST表来维护区间矩阵乘积
然后注意一些细节,比如 m <script type="math/tex" id="MathJax-Element-259">m</script>段分段如果两个不周期位置连续,以及最后一个段等等。

想法还是比价明显的,但是确实不好写….

#include<bits/stdc++.h>
using namespace std;
const int MAXN=50005;
int MOD;
struct Matrix {int Data[2][2];
};
Matrix operator*(Matrix a,Matrix b)
{Matrix c;memset(c.Data,0,sizeof(c.Data));for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {for(int k=0;k<2;k++) {c.Data[i][j]+=(long long)a.Data[i][k]*b.Data[k][j]%MOD;c.Data[i][j]%=MOD;}}}return c;
}
int a[MAXN];
pair<long long,int>P[MAXN];
Matrix ST[MAXN][63];
int n;
Matrix query(long long l,long long len)
{int pos=l%n;Matrix ans;for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {ans.Data[i][j]=i==j?1:0;}}for(int i=0;i<63;i++) {if(len&(1LL<<i)) {ans=ans*ST[pos][i];pos=(pos+(1LL<<i)%n)%n;}}return ans;
}
int main()
{//freopen("a.txt","r",stdin);long long k;while(~scanf("%I64d%d%d",&k,&MOD,&n)) {for(int i=0;i<n;i++) {scanf("%d",&a[i]);}int m;scanf("%d",&m);for(int i=0;i<m;i++) {scanf("%I64d%d",&P[i].first,&P[i].second);}sort(P,P+m);for(int i=0;i<n;i++) {ST[i][0].Data[0][0]=a[(i-1+n)%n];ST[i][0].Data[1][0]=a[(i-2+n)%n];ST[i][0].Data[0][1]=1;ST[i][0].Data[1][1]=0;}for(int j=1;j<63;j++) {for(int i=0;i<n;i++) {ST[i][j]=ST[i][j-1]*ST[(i+(1LL<<(j-1))%n)%n][j-1];}}Matrix S;S.Data[0][0]=1;S.Data[0][1]=0;if(k==0) {printf("0\n");continue;}if(k==1) {printf("%d\n",1%MOD);continue;}long long l=1;for(int i=0;i<m;i++) {long long r=P[i].first;if(r>=k)  break;S=S*query(l+1,r-l);l=r;//printf("%d-%d %d\n",l,S.Data[0][0],S.Data[0][1]);if(l>=k)  break;Matrix tmp;tmp.Data[0][0]=P[i].second;tmp.Data[1][0]=(i==0||P[i-1].first+1!=P[i].first)?a[(r-1+n)%n]:P[i-1].second;tmp.Data[0][1]=1;tmp.Data[1][1]=0;S=S*tmp;l=r+1;//printf("%d--%d %d %d %d\n",l,S.Data[0][0],S.Data[0][1],tmp.Data[0][0],tmp.Data[1][0]);if(l>=k)  break;if(i==m-1||P[i].first+1!=P[i+1].first) {tmp.Data[0][0]=a[(r+1)%n];tmp.Data[1][0]=P[i].second;tmp.Data[0][1]=1;tmp.Data[1][1]=0;S=S*tmp;l=r+2;//printf("%d---%d %d\n",l,S.Data[0][0],S.Data[0][1]);if(l>=k)  break;}}S=S*query(l+1,k-l);printf("%d\n",S.Data[0][0]);}return 0;
}

这篇关于Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102378

相关文章

关于 export HF_ENDPOINT=https://hf-mirror.com

# 使用 Hugging Face Hub 镜像:设置和应用场景 ## 引言 Hugging Face 是一个流行的机器学习模型托管平台,它提供了大量的预训练模型和易于使用的API。为了提高访问速度和降低延迟,Hugging Face 提供了镜像服务,用户可以通过设置环境变量 `HF_ENDPOINT` 来指定使用特定的镜像地址。本文将介绍如何设置 `HF_ENDPOINT` 环境变量,并探讨

[LeetCode] 901. Online Stock Span

题:https://leetcode.com/problems/online-stock-span/ 题目大意 不断给出元素,求当前元素开始往前的最大子串,且串中每个元素的值都小于等于 该元素。 思路 class stockPair{int price;int day;public stockPair(int price,int day){this.price = price;this.d

【深度学习详解】Task2 分段线性模型-引入深度学习 Datawhale X 李宏毅苹果书 AI夏令营

前言 《苹果书》第一章的内容包括 机器学习基础 -> 线性模型 -> 分段线性模型 -> 引入深度学习 这一篇章我们继续后续内容 ~ 其中涉及到“激活函数”的作用理解: 除了 开源项目 - 跟李宏毅学深度学习(入门) 之外, 还有 @3Blue1Brown 的神经网络 和 @StatQuest 的深度学习 视频内容辅助。 🍎 🍎 系列文章导航 【深度学习详解】Task1 机器学习基础-

用于基于骨架的动作识别的空间时间图卷积网络 ST-GCN (代码+数据集+模型)

简介 本仓库包含论文《用于基于骨架的动作识别的空间时间图卷积网络》的相关代码、数据集和模型。 ST-GCN 动作识别演示 我们的基于骨架的动作识别演示展示了ST-GCN如何从人体骨架中提取局部模式和关联性。下图显示了我们ST-GCN最后一层中每个节点的神经响应幅度。 触摸头部 坐下 脱鞋 进食 投踢他人 掷锤 清洁与抓举 拉力器 太极拳 抛球 上一行结果来自NTU-RGB+D数据集,第

什么是分段和分页?

内存管理的必要性 很早之前计算机只能运行单个进程,就算运行批处理程序,也是棑好对,一个一个的进行处理,不存在多个进程并发运行,这时候内核对于内存管理相对比较简单,直接把物理内存地址拿过来是使用即可。 随着计算机演进,支持多进程的OS,多个进程都都使用同一个物理地址空间,很容易多个进程之间相互干扰而引起进程的不可预期的行为。为了解决这个问题,CPU中的MMU(内存管理单元)引入了虚拟地址空间。

5.4分段线性灰度变换

目录 实验原理 分段线性灰度变换的概念 变换函数的形式 示例代码1 示例结果1 示例代码2 示例结果2 示例代码3 运行结果3 示例代码4 运行结果4 实验原理 在OpenCV中,分段线性灰度变换(Piecewise Linear Gray Level Transformation)是一种更复杂的图像处理技术,它允许对图像的不同灰度区间应用不同的线性变换。这种方法

自定义控件 - SeekBar,支持横竖两种状态,支持分段,滑动带动画效果

转载请标明出处: http://blog.csdn.net/u013254166/article/details/79161348 本文出自: 【rhino博客】  直接上效果图,实现很简单,这里就不赘述了。 最后附上源码下载链接,点击下载。

18042 计算分段函数值

### 伪代码 1. 读取输入的实数x。 2. 根据x的值计算y:    - 如果x < 1,y = x。    - 如果1 <= x < 10,y = 2x - 1。    - 如果x >= 10,y = 3x - 11。 3. 输出y的值,保留两位小数。 ### C++代码 #include <iostream>#include <iomanip>using namespace s

Maven Repositories 顺序和 Mirror

Maven Repositories 顺序和 Mirror Repositories 配置和下载顺序 1、setting(先)repositories 1repositories 2repositories ...2、pom(中)repositories 1repositories 2repositories ...3、central(后) repositories中的reposito

HarmonyOS NEXT实战:“相机分段式拍照”性能提升实践

概述 相机拍照性能依赖算法处理的速度,而处理效果依赖算法的复杂度,算法复杂度越高的情况下会导致处理时间就越长。目前系统相机开发有两种相机拍照方案,分别是相机分段式拍照和相机单段式拍照: 分段式拍照是系统相机开发的重要功能之一,即相机拍照可输出低质量图用作缩略图,提升用户感知拍照速度,同时使用高质量图保证最后的成图质量达到系统相机的水平,构筑相机性能竞争力。这样可以优化系统的拍照响应时延,从而提