题目


分析

\(K\)那么大肯定是矩阵乘法,

带修改可以用线段树单点修改,

转移矩阵类似于斐波那契数列,

这题思维难度不大,细节很多,需要很长时间QWQ

时间复杂度\(O(mlog_2K)\),具体注释在代码中


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=50011; typedef long long lll;
struct rec{lll x; int y,type;}q[N<<1];
struct maix{int p[2][2];}A[N],B[N],ANS,w[N<<2],W[61];
int mod,a[N],n,m; lll pos;
inline lll iut(){
rr lll ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline maix mul(maix A,maix B,int t=2){
rr maix C;
for (rr int i=0;i<t;++i) for (rr int j=0;j<2;++j)
C.p[i][j]=mo(1ll*A.p[i][0]*B.p[0][j]%mod,1ll*A.p[i][1]*B.p[1][j]%mod);
return C;
}
inline void build(int k,int l,int r){
if (l==r){
w[k]=A[l];
return;
}
rr int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
w[k]=mul(w[k<<1],w[k<<1|1]);
}
inline void update(int k,int l,int r,int x){
if (l==r){
w[k]=B[x];
return;
}
rr int mid=(l+r)>>1;
if (x<=mid) update(k<<1,l,mid,x);
else update(k<<1|1,mid+1,r,x);
w[k]=mul(w[k<<1],w[k<<1|1]);
}
bool cmp(rec x,rec y){return x.x<y.x;}
inline maix doit(lll x){
rr maix ANS;
ANS.p[0][0]=1,ANS.p[1][0]=0,
ANS.p[0][1]=0,ANS.p[1][1]=1;
for (rr int i=0;i<60;++i)
if ((x>>i)&1) ANS=mul(ANS,W[i]);
return ANS;
}
signed main(){
pos=iut(),mod=iut(),n=iut(),ANS.p[0][1]=1;
for (rr int i=0;i<n;++i) a[i]=iut()%mod;
for (rr int i=1;i<=n;++i) A[i].p[1][1]=a[i%n],A[i].p[0][1]=a[i-1],A[i].p[1][0]=1,B[i]=A[i];
m=iut();
for (rr int i=1;i<=m;++i) q[i+m].x=(q[i].x=iut())+1,q[i+m].y=q[i].y=iut()%mod,q[i].type=1;//一个特例影响两个矩阵
build(1,1,n),sort(q+1,q+1+m*2,cmp),W[0]=w[1];
for (m<<=1;m&&q[m].x>pos;--m); rr lll now,NOW=0;
for (rr int i=1;i<60;++i) W[i]=mul(W[i-1],W[i-1]);
for (rr int l=1,r;l<=m;l=r+1){
for (now=(q[r=l].x-1)/n;r<m&&now==(q[r+1].x-1)/n;++r);//同一个周期
ANS=mul(ANS,doit(now-NOW),1),NOW=now;//中间段快速幂跳过
for (rr int i=l;i<=r;++i){
rr int POS=(q[i].x-1)%n+1;
B[POS].p[q[i].type][1]=q[i].y;
update(1,1,n,POS);
}
if (now==pos/n) break; ANS=mul(ANS,w[1],1),++NOW;
for (rr int i=l;i<=r;++i){
rr int POS=(q[i].x-1)%n+1;
B[POS]=A[POS],update(1,1,n,POS);//恢复原样
}
}
now=pos/n,ANS=mul(ANS,doit(now-NOW),1);
for (rr int i=1;i<=pos%n;++i) ANS=mul(ANS,B[i],1);//散的矩阵单独乘
return !printf("%d",ANS.p[0][0]);//输出前一个(一开始[0,1]代表的是第0个矩阵)
}

#矩阵乘法,线段树#CF575A Fibonotci的更多相关文章

  1. THUSCH 2017 大魔法师(矩阵乘法+线段树)

    题意 https://loj.ac/problem/2980 思路 区间修改考虑用线段树维护.由于一段区间的 \(A,B,C\) 可以表示成由原来的 \(A,B,C\) 乘上带上系数再加上某一个某个常 ...

  2. Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)

    题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...

  3. ZOJ 2671 Cryptography 矩阵乘法+线段树

    B - Cryptography Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Subm ...

  4. HDU 6155 Subsequence Count(矩阵乘法+线段树+基础DP)

    题意 给定一个长度为 \(n\) 的 \(01\) 串,完成 \(m\) 种操作--操作分两种翻转 \([l,r]\) 区间中的元素.求区间 \([l,r]\) 有多少个不同的子序列. \(1 \le ...

  5. HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模

    Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. codeforces750E New Year and Old Subsequence 矩阵dp + 线段树

    题目传送门 思路: 先看一个大牛的题解 题解里面对矩阵的构造已经写的很清楚了,其实就是因为在每个字符串都有固定的很多中状态,刚好可以用矩阵来表达,所以$(i,j)$这种状态可以通过两个相邻的矩阵的$m ...

  7. HDU 6155 Subsequence Count(矩阵 + DP + 线段树)题解

    题意:01串,操作1:把l r区间的0变1,1变0:操作2:求出l r区间的子序列种数 思路:设DP[i][j]为到i为止以j结尾的种数,假设j为0,那么dp[i][0] = dp[i - 1][1] ...

  8. 2019杭电多校6 hdu6638 Snowy Smile(二维最大矩阵和 线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你一些点的权值,让找一个矩形圈住一部分点,问圈住点的最大权值和 分析:由于是稀疏图,明显要先把x, ...

  9. E. Sasha and Array 矩阵快速幂 + 线段树

    E. Sasha and Array 这个题目没有特别难,需要自己仔细想想,一开始我想了一个方法,不对,而且还很复杂,然后lj提示了我一下说矩阵乘,然后再仔细想想就知道怎么写了. 这个就是直接把矩阵放 ...

  10. 【vijos】1750 建房子(线段树套线段树+前缀和)

    https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...

随机推荐

  1. .NET高级调试之sos命令输出看不懂怎么办

    一:背景 1. 讲故事 很多.NET开发者在学习高级调试的时候,使用sos的命令输出会发现这里也看不懂那里也看不懂,比如截图中的这位朋友. .NET高级调试属于一个偏冷门的领域,国内可观测的资料比较少 ...

  2. Ubuntu下docker部署

    使用docker进行容器化集成部署 远程服务器更新源 更新ubuntu的apt源 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo dpkg --configu ...

  3. 【Azure App Service】误删除App Service资源,怎么办?

    问题描述 操作不当,误删除了App Service的资源,怎么办? 问题解答 根据Azure 官方文档,可以使用 Powershell 命令恢复到原始 App Service 应用名称. 操作步骤 第 ...

  4. 【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?

    问题描述 App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢? 问题解答 答案是可以的,Azure App Service .NE ...

  5. 【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中

    问题描述 是否可以将Swagger 的API定义导入导Azure API Management中? 操作步骤 是的,可以通过APIM门户导入单个的API Swagger定义文件.具体步骤如下: 第一步 ...

  6. 【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk

    问题描述 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk.在Azure门户中可以通过查看Backup Item查 ...

  7. 李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)

    Homework4 Dataset介绍及处理 Dataset introduction 训练数据集metadata.json包括speakers和n_mels,前者表示每个speaker所包含的多条语 ...

  8. Jmeter中属性跟变量的区别?

    Jmeter属性全局生效,变量局部生效,jmeter属性默认读取jmeter.properties中的属性配置,在jmeter运行过程中,通过函数${_setProperty(属性名,属性值)来定义 ...

  9. [VueJsDev] 日志 - BBTime-LOG

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html BBTime-LOG ::: details 目录 目录 B ...

  10. python 音频通道分离的源码实现

    一 前记 作为一个音频工程师,仅仅依靠鼠标点击,没有一些自己的小工具的话,肯定是不合格的了. 最近用到了一个音频通道分离的功能,这里就用python敲击了一下,这里做个备忘吧,给有需求的小伙伴抛砖引玉 ...