题目大意:f[k]=f[k-1]*s[(n-1)%n]+f[(k-2)]*s[(k-2)%n];会修改某一位置的s值,但循环不变,求f[k];

矩阵快速幂裸题,由于有修改,所以需要线段树优化

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 50005
#define f(c,d) ((1<<(c))*(d))
struct node{
ll x[][];
}mt,mi,t,tt,x[][maxn];
int n,m,p;
ll k,s[maxn],ti;
pair<ll,ll>v[maxn];
node operator * (node a,node b){
node c=mt;
for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<;++k)
c.x[i][j]=(c.x[i][j]+a.x[i][k]*b.x[k][j]%p)%p;
return c;
}
node operator ^ (node a,ll y){
if(y==)return mi;
node c=a;y--;
while(y){
if(y&)c=c*a;
y>>=;a=a*a;
}return c;
}
node ask(int a,int b,int c,int d){
if(f(c,d)==a&&f(c,d+)==b)return x[c][d];
c--;d=d<<|;
if(b<=f(c,d))return ask(a,b,c,d-);
if(a>=f(c,d))return ask(a,b,c,d);
return ask(a,f(c,d),c,d-)*ask(f(c,d),b,c,d);
}
node ask(int a,int b){
if(a==b)return mi;
return ask(a,b,,);
}
void to(ll a){
if(a/n-ti/n){
t=t*ask(ti%n,n);
t=t*(x[][]^(a/n-ti/n-));
t=t*ask(,a%n);
}else t=t*ask(ti%n,a%n);
ti=a;
}
int main(){
scanf("%I64d%d",&k,&p);
mi.x[][]=mi.x[][]=%p;
scanf("%d",&n);
for(int i=;i<n;++i)scanf("%I64d",&s[i]);
for(int i=;i<n;++i){
x[][i].x[][]=s[i]%p;
x[][i].x[][]=;
x[][i].x[][]=s[(i+)%n]%p;
}
for(int i=;i<;++i)
for(int j=;f(i,j)<n;++j){
x[i][j]=x[i-][j<<];
if(f(i-,(j<<|))<n)x[i][j]=x[i-][j<<]*x[i-][j<<|];
}
scanf("%d",&m);
for(int i=;i<m;++i)scanf("%I64d%I64d",&v[i].first,&v[i].second);
sort(v,v+m);
ti=;
t=mi;
for(int i=;i<m;++i){
if(v[i].first>k)break;
if(ti!=v[i].first){
to(v[i].first-);
tt.x[][]=s[ti%n]%p;
tt.x[][]=;
tt.x[][]=v[i].second%p;
t=t*tt;
ti++;
}
if(ti==k)break;
ti++;
tt.x[][]=v[i].second%p;
tt.x[][]=;
tt.x[][]=(v[i+].first==ti?v[i+].second:s[ti%n])%p;
t=t*tt;
}
to(k);
printf("%I64d\n",t.x[][]);
return ;
}

575A

codeforces575A Fibonotci的更多相关文章

  1. cf575A Fibonotci

    Fibonotci sequence is an integer recursive sequence defined by the recurrence relation Fn = sn - 1·F ...

  2. Bubble Cup 8 finals A. Fibonotci (575A)

    题意: 定义类循环序列为 长度无限,且除了有限个元素外,均满足s[i] ≡ s[i mod N] (i≥N). 现在有数列F,定义为 F[i] = s[i-2]*F[i-1] + s[i-1]*F[i ...

  3. CF575A Fibonotci [线段树+矩阵快速幂]

    题意 \(s\{\}\) 是一个循环数列 循环节为 \(n\),你可以改掉 \(m\) 项,这 \(m\) 项独立,且不影响循环节 考虑线段树维护矩阵,单点修改最多m次,每次矩阵快速幂就完事了 // ...

  4. Codeforces 575A - Fibonotci

    题面传送门 题意: 给出 \(s_0,s_1,s_2,\dots,s_{n-1}\),对于 \(i\geq n\),有 \(m\) 个 \(s_i\) 满足 \(s_i\neq s_{i\bmod n ...

  5. 「考试」联赛模拟36-39,noip晚间小测2-3

    36.1 party(CF623D) 很是鸡贼的一道题 首先要明确一点,抓人是有策略,而不是随机的,可以认为等同于按一个给定的顺序猜人,那么这时猜中的概率就只是抓住这个人的概率了 对于每一次猜测,因为 ...

随机推荐

  1. hdu1863 最小生成树(prim)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1863 思路:最小生成树模板题,直接套模板. 代码: #include<iostrea ...

  2. 《DSP using MATLAB》示例Example4.15

    代码: b = [1/3, 1/3, 1/3]; a = [1, -0.95, 0.9025]; % x(n) y(n) coefficient [R, p, C] = residuez(b,a) M ...

  3. 黑客语(Leet)

    黑客语(Leet)   Leet是从网络发展起来的一种文字书写方式.通常将英语中的字母替换为数字和特殊符号.这种方式被很多黑客组织所使用.由于具有隐密性,所以它也广泛被用于密码中.使用Leet书写的密 ...

  4. js-原型以及继承小案例

    function human(name,tall){ this.name=name; this.tall=tall; this.toSleep=function(){ alert('no sleep' ...

  5. jQuery实现等比例缩放大图片

      在布局页面时,有时会遇到大图片将页面容器“撑破”的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面布局. 通常我们 ...

  6. http://blog.csdn.net/jyw935478490/article/details/51233931

    http://blog.csdn.net/jyw935478490/article/details/51233931

  7. iOS 初学UITableView、UITableViewCell、Xib

    注意事项: 1.一个.xib里面最多设置一个cell 2.要仔细调整自动布局,其实它不太好用 3.记得设置<UITableViewDataSource>委托 4.记得在ViewContro ...

  8. C# 词法分析器(三)正则表达式

    系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 正则表达式是一种描述词素的重要表示方法.虽然正则表达 ...

  9. Python学习笔记05

    类 继承:单继承,多继承 方法:self开头,类似C#中的this 属性:直接写变量 对象:使用类名() 构造 __init__():构造函数 #多继承 class A(object): ...... ...

  10. 【BZOJ】3211: 花神游历各国

    题意 \(n\)个点,第\(i\)个点值为\(a_i\).\(m\)个询问,每次询问\([l, r]\)内的和或者将\([l, r]\)的每个值改为自己的算术平方根.(\(n \le 100000, ...