#矩阵乘法,线段树#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 ...
随机推荐
- 关于json序列化时报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
1.今天在写客户端与服务端交互的程序的时候,发现了一个问题 客户端代码 #客户端程序主要是发送注册请求/登录请求给服务端,服务端接收响应后回应对应的应答给客户端,客户端接收响应后,然后做一些操作 # ...
- 【生成对抗网络学习 其二】GAN(keras实现)代码阅读笔记
想来想去还是记录一下吧,主要是怕以后时间长忘了 好记性不如烂笔头 代码来自eriklindernoren的开源GAN实现:https://github.com/eriklindernoren/Kera ...
- 老生常谈的iOS- weak原理,你真的懂得还是为了应付面试
前言 weak对于iOS开发来说只要解决一些对象相互引用的时候,避免出现强强引用,对象不能被释放,出现内存泄露的问题. weak 关键字的作用域弱引用,所引用对象的计数器不会加一,并在引用对象被释放的 ...
- 一文带你了解 「图数据库」Nebula 的存储设计和思考
本文首发于 Nebula Graph Community 公众号 在上次的 nebula-storage on nLive 直播中,来自 Nebula 存储团队的负责人王玉珏(四王)同大家分享了 ne ...
- Netty笔记(6) - 粘包拆包问题及解决方案
Netty 中 TCP 粘包拆包问题 信息通过tcp传输过程中出现的状况 . TCP是个"流"协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根 ...
- 建立两台linux主机的ssh信任,实现ssh免密登录远程服务器
1.介绍 假设我们现在有AB两个服务器,要求A能够远程登录到B服务. CentOS版本:CentOS Linux release 7.6.1810 (Core) 2.实操 1.先在A服务上输入以下命令 ...
- 当未指定且存在多个构造器,实例化对象时Spring如何选择?
前言 在前面的讲解中,我们了解了如何获取构造器.当只有一个符合条件的构造器时,自然会选择它作为初始化的构造器.然而,在上一节中,我们遇到了一种特殊情况:当有多个符合条件的构造器时,返回的是一个数组.在 ...
- acme.sh 免费泛解析证书生成
环境准备 本篇文章使用的 ACME 客户端是基于 Docker 容器使用的,所以需要准备 Docker 运行环境.本文使用的是 CentOS 7.x 与 Docker CE - 19.03.13,且已 ...
- Zabbix技术分享——snmp异常排查指南
大家好,我是乐乐.在IT运维中,难免会碰上设备snmp不通的情况,那么,当问题出现的时候,运维工程师该如何快速找到问题所在呢?下面让我们一起来看看吧! 1.IP配置检查 首先检查zabbix监控上 ...
- CodeGeeX vscode代码提示,智能问答
CodeGeeX 官网 https://codegeex.cn/zh-CN/ CodeGeeX vscode代码提示,智能问答