题意:

定义类循环序列为 长度无限,且除了有限个元素外,均满足s[i] ≡ s[i mod N] (i≥N)。

现在有数列F,定义为 F[i] = s[i-2]*F[i-1] + s[i-1]*F[i-1],特别的,F[0] = 0, F[1] = 1。

给定正整数K,P,N代表要求输出的答案为F[k] mod P,类循环序列s的长度为N。

接下来给出s[0]..s[n-1]。

然后是一个正整数M,代表不满足循环条件的元素个数。

接下来M行每行两个正整数j,v表示s[j] = v,保证所有j不同。

1<=N,M<=10^5,

1<=P,s[i],v<=10^9,

1<=K,j<=10^18

题解:

会矩阵乘法快速转移的一看就知道大概的做法…所以思考难度不算高。

但是实现起来比较麻烦。

可以明显地看出,没有被特殊位置影响到递推式的部分可以快速转移。

所以我们排序并求出所有被特殊位置影响到递推式的位置(即特殊位置的后两个位置)。

然后按照排序相邻的两个受影响位置的位置关系分类来做:

1、两个受影响位置分离,中间包含若干个循环

那么我们可以在预处理时求出一个循环内所有转移矩阵的乘积,

然后找出当前位置所处的循环节末尾,下一个位置所处的循环节开头,

把这中间的部分用快速幂处理出来。

而当前位置到循环节末的部分,可以用反向的前缀和或线段树处理。

循环节头到下一个位置的部分,可以用前缀和或线段树处理。

(这里用前缀和是O(1),但是因为还有快速幂,总的复杂度没有降低)

2、两个受影响位置分离,在同一循环节之中

这种情况可以直接用线段树求处理出区间的乘积。

3、两个受影响位置相邻

直接暴力计算。

这种做法不用考虑连续的受影响位置跨越循环节的情况,写起来比较方便,不那么容易写挂。

(然而我因为诸如没开long long这类的低级错误挂了很多次)

时间复杂度O( (2^3) * M log N )

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = , NS = +;
typedef long long lint;
typedef pair<lint,int> pli;
inline int read()
{
int s = ; char c; while((c=getchar())<'0'||c>'9');
do{s=s*+c-'0';}while((c=getchar())>='0'&&c<='9');
return s;
}
inline lint readll()
{
lint s = ;char c; while((c=getchar())<'0'||c>'9');
do{s=s*+c-'0';}while((c=getchar())>='0'&&c<='9');
return s;
}
int n,m,p,s[N],br[N+N],cr[N+N],cur,S,tot;
lint k,ar[N+N];
pli q[N];
struct mrx
{
int n[][];
void clr(){ memset(n,,sizeof n); }
friend mrx operator * (const mrx &a,const mrx &b)
{
mrx c; c.clr();
for(int i=;i<;i++) for(int k=;k<;k++) if(a.n[i][k]) for(int j=;j<;j++)
c.n[i][j] = ((lint)c.n[i][j]+(lint)a.n[i][k]*b.n[k][j])%p;
return c;
}
}ym,tm[N],stm,I,tmpm,tr[NS],psm[N],ssm[N];
inline lint mo(lint a){ return (a+n-)%n+; }
mrx powmod(mrx a,lint b)
{
mrx ans = I;
for(;b;b>>=)
{
if(b&) ans = ans*a;
a = a*a;
}
return ans;
}
mrx query(int l,int r)
{
if(l>r) return I;
mrx ls = I, rs = I;
for(l=l+S-,r=r+S+;l^r^;l>>=,r>>=)
{
if(~l&) ls = ls*tr[l^];
if( r&) rs = tr[r^]*rs;
}
return ls*rs;
}
int calc()
{
int i;
for(i=;i<=m;i++)
{
if(q[i].first>=k) break;
ar[++tot] = q[i].first+;
br[tot] = (q[i].first==q[i-].first+)?q[i-].second:s[(q[i].first+n-)%n+];
cr[tot] = q[i].second;
if(q[i].first+!=q[i+].first&&q[i].first+<=k)
ar[++tot] = q[i].first+, br[tot] = cr[tot-], cr[tot] = s[(q[i].first+)%n+];
}
tmpm = tm[];
cur = ; while(cur<=tot&&ar[cur]<) cur++;
ar[--cur] = ;
ar[++tot] = k+;
lint ql,qr;
for(;cur<tot;cur++)
{
if(cur+!=tot&&ar[cur+]==ar[cur]+)
{
tmpm.n[][] = br[cur+], tmpm.n[][] = cr[cur+];
ym = ym*tmpm;
continue;
}
ql = (lint)((ar[cur]-)/n)*n+n;
qr = (lint)((ar[cur+]-)/n)*n+;
if(ql<qr)
ym = ((ym * ssm[(ar[cur]-)%n+]) * powmod(psm[n],(qr-ql-)/n)) * psm[ar[cur+]-qr];
else
ym = ym * query(mo(ar[cur]+),mo(ar[cur+]-));
if(cur+==tot) break;
tmpm.n[][] = br[cur+], tmpm.n[][] = cr[cur+];
ym = ym*tmpm;
}
return ym.n[][];
}
int main()
{
int i;
k = readll(), p = read();
if(k<){ printf("%d\n",(int)k%p); return ; }
for(i=,n=read();i<=n;i++) s[i] = read();
for(S=;S<=n+;S<<=);
s[n+] = s[];
ym.n[][] = ; I.n[][] = I.n[][] = ; psm[] = ssm[n+] = I;
for(i=;i<=n;i++)
{
tm[i].n[][] = ;
tm[i].n[][] = s[(i+n*-)%n+];
tm[i].n[][] = s[(i+n*-)%n+];
tr[S+i] = tm[i];
psm[i] = psm[i-] * tm[i];
}
for(i=n;i>=;i--) ssm[i] = tm[i] * ssm[i+];
for(i=S;i>=;i--) tr[i] = tr[i+i] * tr[i+i+];
for(i=,m=read();i<=m;i++) q[i].first = readll(), q[i].second = read();
q[].first = q[m+].first = -;
sort(q+,q++m);
printf("%d\n",calc());
return ;
}

Bubble Cup 8 finals A. Fibonotci (575A)的更多相关文章

  1. Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1

    Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...

  2. Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】

    Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...

  3. Bubble Cup 8 finals I. Robots protection (575I)

    题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<= ...

  4. Bubble Cup 8 finals H. Bots (575H)

    题意: 简单来说就是生成一棵树,要求根到每个叶子节点上的路径颜色排列不同, 且每条根到叶子的路径恰有n条蓝边和n条红边. 求生成的树的节点个数. 1<=n<=10^6 题解: 简单计数. ...

  5. Bubble Cup 8 finals G. Run for beer (575G)

    题意: 给定一个带权无向图,每条边的代价为边权/当前速度,每次到达一个新节点,速度都会除以10. 求0号点到n-1号点的最小代价,如果多解输出点数最少的解,输出代价.路径点数.路径经过的点. 1< ...

  6. Bubble Cup 8 finals F. Bulbo (575F)

    题意: 给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动, 查询时需要花费当前位置到区间内最近的点的距离,求最小代价. 1<=n<=5000,1<=所有位置< ...

  7. Bubble Cup 8 finals E. Spectator Riots (575E)

    题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三 ...

  8. Bubble Cup 8 finals D. Tablecity (575D)

    题意: (无输入,纯输出题) 一个城市用1000列2行的格子表示,一个小偷藏在城市的某一处. 在每一小时的开始, 在(X, Y)位置的小偷可以移动到 (X - 1, Y), (X + 1, Y),(X ...

  9. Bubble Cup 8 finals C. Party (575C)

    题意: 给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同. 每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大. 夜总会数量= ...

随机推荐

  1. URL_MODEL 2 不能访问 在APACHE服务器上的访问方式上去除index.php

    thinkphp URL_MODEL=2,访问链接http://i.cnblogs.com/Online/index.html  报错: Not Found The requested URL /on ...

  2. Centos6.5安装mysql不能启动,应该安装mysql-server

    centos中安装mysql很简单如下命令即可 yum install mysql 装好了, 运行mysql ERROR 2002 (HY000): Can't connect to local My ...

  3. spring 事务回滚

    1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: public method() { Dao1.save(Person1); Dao1.save( ...

  4. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

  5. background-attachment属性进阶

    前提是定义了background-image属性,然后用background-attachment来指明背景图的位置是固定于视口的,还是随着包含块移动的.可简单理解为定义背景图片随滚动轴的移动方式. ...

  6. ubuntu 14.04 配置tomacat8

    自己在虚拟机总安装tomcat8,主机访问,记下步骤方便以后查看. 1.将tomcat8安装包移动到/usr/local目录中(个人喜欢把自己安装的软件放到/usr/local文件夹中) 2.解压缩, ...

  7. uva 1599 ideal path(好题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGYAAAODCAYAAAD+ZwdMAAAgAElEQVR4nOy9L8/0ypH/Pa8givGiyC

  8. python-进程&线程

    进程(process):相当于一个程序要运行时所需的所有资源的集合,相当于一个车间,不工作 两个进程之间的数据不共享,完全不独立,互相不能访问. 线程(thread):一道单一指令的控制流,寄生在进程 ...

  9. BZOJ 4008 【HNOI2015】 亚瑟王

    题目链接:亚瑟王 这道题好神啊TAT--果然我的dp还是太弱了-- 一开始想了半天的直接dp求期望,结果最后WA的不知所云-- 最后去翻了题解,然后发现先算概率,再求期望--新姿势\(get\). 我 ...

  10. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...