Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】
来源:互联网 发布:vmware tools linux 编辑:程序博客网 时间:2024/05/20 13:12
因为
那么就将序列分成
然后注意一些细节,比如
想法还是比价明显的,但是确实不好写….
#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;}
0 0
- Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】
- Bubble Cup 8 - Finals [Online Mirror]
- Codeforces Bubble Cup 8 - Finals [Online Mirror] 解题报告
- Bubble Cup 8 - Finals [Online Mirror]C. Party
- Bubble Cup 9 - Finals [Online Mirror] 题解
- Bubble Cup 9 - Finals [Online Mirror] C. Potions Homework (水题)
- 图论+DFS——Bubble Cup 9 - Finals [Online Mirror] E
- VK Cup 2015 - Finals, online mirror
- Codeforce Bubble Cup 8 - Finals D Tablecity
- codeforce Bubble Cup 8 - Finals G Run for beer
- VK Cup 2015 - Finals, online mirror F. Clique in the Divisibility Graph 数论
- VK Cup 2015 - Finals, online mirror D. Restructuring Company 并查集 stl应用
- VK Cup 2015 - Finals, online mirror F - Clique in the Divisibility Graph dp
- Matching Names(Trie树)-(VK Cup 2015 - Finals, online mirror)
- VK Cup 2015 - Finals, online mirror D. Restructuring Company 并查集 set 二分
- Bubble Cup 9 - Finals E. 搜索
- codeforces ABBYY Cup 3.0 - Finals (online version) B2. Shave Beaver!
- [排序不等式] Codeforces 717C Bubble Cup 9 - Finals C. Potions Homework
- 数据结构之自建算法库——顺序表
- SVN学习笔记1 -- 为什么要使用SVN
- SharePoint 2010商业智能组件
- Qt5.2 for Android 配置及部署到手机运行
- php利用smtp类轻松的发送电子邮件
- Bubble Cup 8 - Finals [Online Mirror] - A.Fibonotci【分段+ST表】
- codeforce 568A Primes or Palindromes?
- public static <T> List<T> asList(T... a) 原型是怎么回事?
- 错误处理机制
- POJ 题目3580 SuperMemo(Splay Tree区间加,区间翻转,区间右移,插入删除,区间最小值)
- Unity3d 移动设备播放视频纹理
- UVa 1265 Tour Belt Kurscal 变型
- android listView 全部展开,并且点击Item有效,可以用scrollView包裹,实现整体滑动
- iOS pch头文件使用方法