#矩阵乘法,线段树#CF575A Fibonotci
分析
\(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的更多相关文章
- THUSCH 2017 大魔法师(矩阵乘法+线段树)
题意 https://loj.ac/problem/2980 思路 区间修改考虑用线段树维护.由于一段区间的 \(A,B,C\) 可以表示成由原来的 \(A,B,C\) 乘上带上系数再加上某一个某个常 ...
- Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)
题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...
- ZOJ 2671 Cryptography 矩阵乘法+线段树
B - Cryptography Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Subm ...
- HDU 6155 Subsequence Count(矩阵乘法+线段树+基础DP)
题意 给定一个长度为 \(n\) 的 \(01\) 串,完成 \(m\) 种操作--操作分两种翻转 \([l,r]\) 区间中的元素.求区间 \([l,r]\) 有多少个不同的子序列. \(1 \le ...
- HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模
Multiply game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- codeforces750E New Year and Old Subsequence 矩阵dp + 线段树
题目传送门 思路: 先看一个大牛的题解 题解里面对矩阵的构造已经写的很清楚了,其实就是因为在每个字符串都有固定的很多中状态,刚好可以用矩阵来表达,所以$(i,j)$这种状态可以通过两个相邻的矩阵的$m ...
- 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] ...
- 2019杭电多校6 hdu6638 Snowy Smile(二维最大矩阵和 线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你一些点的权值,让找一个矩形圈住一部分点,问圈住点的最大权值和 分析:由于是稀疏图,明显要先把x, ...
- E. Sasha and Array 矩阵快速幂 + 线段树
E. Sasha and Array 这个题目没有特别难,需要自己仔细想想,一开始我想了一个方法,不对,而且还很复杂,然后lj提示了我一下说矩阵乘,然后再仔细想想就知道怎么写了. 这个就是直接把矩阵放 ...
- 【vijos】1750 建房子(线段树套线段树+前缀和)
https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...
随机推荐
- .NET高级调试之sos命令输出看不懂怎么办
一:背景 1. 讲故事 很多.NET开发者在学习高级调试的时候,使用sos的命令输出会发现这里也看不懂那里也看不懂,比如截图中的这位朋友. .NET高级调试属于一个偏冷门的领域,国内可观测的资料比较少 ...
- Ubuntu下docker部署
使用docker进行容器化集成部署 远程服务器更新源 更新ubuntu的apt源 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo dpkg --configu ...
- 【Azure App Service】误删除App Service资源,怎么办?
问题描述 操作不当,误删除了App Service的资源,怎么办? 问题解答 根据Azure 官方文档,可以使用 Powershell 命令恢复到原始 App Service 应用名称. 操作步骤 第 ...
- 【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
问题描述 App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢? 问题解答 答案是可以的,Azure App Service .NE ...
- 【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
问题描述 是否可以将Swagger 的API定义导入导Azure API Management中? 操作步骤 是的,可以通过APIM门户导入单个的API Swagger定义文件.具体步骤如下: 第一步 ...
- 【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk
问题描述 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk.在Azure门户中可以通过查看Backup Item查 ...
- 李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)
Homework4 Dataset介绍及处理 Dataset introduction 训练数据集metadata.json包括speakers和n_mels,前者表示每个speaker所包含的多条语 ...
- Jmeter中属性跟变量的区别?
Jmeter属性全局生效,变量局部生效,jmeter属性默认读取jmeter.properties中的属性配置,在jmeter运行过程中,通过函数${_setProperty(属性名,属性值)来定义 ...
- [VueJsDev] 日志 - BBTime-LOG
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html BBTime-LOG ::: details 目录 目录 B ...
- python 音频通道分离的源码实现
一 前记 作为一个音频工程师,仅仅依靠鼠标点击,没有一些自己的小工具的话,肯定是不合格的了. 最近用到了一个音频通道分离的功能,这里就用python敲击了一下,这里做个备忘吧,给有需求的小伙伴抛砖引玉 ...