http://codeforces.com/contest/719/problem/E

题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作

①对[l,r]区间+一个val ②求出[l,r]区间的和。

定义区间的和为该区间内每个a[i]所对应的斐波那契数列的和。

思路:线段树保存区间val,和区间更新,用矩阵快速幂求解复杂度是m*logn*logk

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = 1e5 + ;
const LL mod = 1e9 + ;
struct Node{
LL mat[][];
void reset(){memset(mat, , sizeof(mat));}
void getone(){
reset();
mat[][] = mat[][] = ;
}
}; inline Node mul(Node A, Node B){
Node ans; ans.reset();
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < ; k++)
ans.mat[i][j] = (ans.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % mod;
return ans;
} inline Node add(Node a, Node b){
Node ans; ans.reset();
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
ans.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % mod;
return ans;
} inline Node kpow(LL k){
Node ans; ans.reset();
ans.mat[][] = ans.mat[][] = ;
Node A;
A.mat[][] = A.mat[][] = A.mat[][] = ;
A.mat[][] = ;
while (k){
if (k & ) ans = mul(ans, A);
A = mul(A, A);
k >>= ;
}
return ans;
} struct Mytree{
Node sum;
Node lazyk;
}tree[maxn << ]; int n, m; inline void push_up(int o){
int lb = o << , rb = o << | ;
tree[o].sum = add(tree[lb].sum, tree[rb].sum);
} void build_tree(int l, int r, int o){
if (l == r){
LL k; scanf("%lld", &k);
tree[o].sum = kpow(k);
tree[o].lazyk.getone();
return ;
}
tree[o].sum.reset(); tree[o].lazyk.getone();
int mid = (l + r) / ;
if (l <= mid) build_tree(l, mid, o << );
if (r > mid) build_tree(mid + , r, o << | );
push_up(o);
} inline void push_down(int o){
int lb = o << , rb = o << | ;
tree[lb].sum = mul(tree[lb].sum, tree[o].lazyk);
tree[lb].lazyk = mul(tree[lb].lazyk, tree[o].lazyk); tree[rb].sum = mul(tree[rb].sum, tree[o].lazyk);
tree[rb].lazyk = mul(tree[rb].lazyk, tree[o].lazyk); tree[o].lazyk.getone();
} void update(int l, int r, int ql, int qr, Node k, int o){
if (ql <= l && qr >= r){
tree[o].sum = mul(tree[o].sum, k);
tree[o].lazyk = mul(tree[o].lazyk, k);
return ;
}
int mid = (l + r) / ;
push_down(o);
if (ql <= mid) update(l, mid, ql, qr, k, o << );
if (qr > mid) update(mid + , r, ql, qr, k, o << | );
push_up(o);
return ;
} Node query(int l, int r, int ql, int qr, int o){
if (ql <= l && qr >= r){
return tree[o].sum;
}
push_down(o);
Node ans; ans.reset();
int mid = (l + r) / ;
if (ql <= mid) ans = add(query(l, mid, ql, qr, o << ), ans);
if (qr > mid) ans = add(query(mid + , r, ql, qr, o << | ), ans);
push_up(o);
return ans;
} int main(){
scanf("%d%d", &n, &m);
build_tree(, n, );
for (int i = ; i < m; i++){
int ty; scanf("%d", &ty);
if (ty == ){
int l, r; LL k;
scanf("%d%d%lld", &l, &r, &k);
update(, n, l, r, kpow(k), );
}
else if (ty == ){
int l, r; scanf("%d%d", &l, &r);
Node ans = query(, n, l, r, );
printf("%lld\n", ans.mat[][]);
}
}
return ;
}

线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E的更多相关文章

  1. Wannafly Winter Camp 2019.Day 8 div1 E.Souls-like Game(线段树 矩阵快速幂)

    题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵, ...

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

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

  3. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  4. [快速幂]Codeforces Round #576 (Div. 2)-C. MP3

    C. MP3 time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  5. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  6. Codeforces Round #373 (Div. 2)A B

    Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 这回做的好差啊,a想不到被hack的数据,b又没有想到正确的思维 = = [题目链 ...

  7. Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵

    E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...

  8. [递推+矩阵快速幂]Codeforces 1117D - Magic Gems

    传送门:Educational Codeforces Round 60 – D   题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...

  9. 矩阵快速幂---BestCoder Round#8 1002

    当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [f(n ...

随机推荐

  1. android开发过程中项目中遇到的坑----布点问题

    我们在红点push 的到达和点击的地方,都加了布点.后来功能上了线,发现,每天的点击都比到达高! 这肯定不科学. 赶紧查问题,打开程序,发红点,关闭程序,布点上传.没问题.数据部门可以收到红点啊! 从 ...

  2. 微信H5支付 在其他浏览器调用微信支付

    微信H5支付的相关资料不是很多.不过步骤上来说不是很复杂 比公众号支付简单很多. 先上官方文档吧 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapt ...

  3. IDLE激活方法

    激活流程 一.通过Activation code 方式激活, 注册码获取地址为:http://idea.lanyus.com/ 在idea或者pycharm的Activation code中输入 注册 ...

  4. kindeditor 限制上传图片大小及宽高

    进入:/kindeditor/plugins/image/image.js,替换其中的 self.plugin.imageDialog = function (options)方法,代码为: self ...

  5. Windows下nginx作为静态资源服务器使用

    一.Nginx下载与安装 1.nginx官方下载地址:http://nginx.org/ 2.下载完后将压缩包解压即可 3.nginx配置文件为根目录下conf\nginx.conf 二.Nginx常 ...

  6. spring boot 打包问题

    一.jar包 1.maven build package 2.linux 下执行 java -jar & 命令后台运行,也可加入服务运行 二.war包 1.将pom中的<packagin ...

  7. IDEA运行lambda表达式

    在idea写了一个lambda的测试例子,但是运行一直报错, public class LambdaTest { public static void main(String[] args) { ne ...

  8. nopcommerce商城系统--安装nopCommerce

    原址:http://www.nopcommerce.com/docs/79/installing-nopcommerce.aspx .NET Framework 4.5.1下载:http://www. ...

  9. Name node is in safe mode.

    刚才启动hadoop,然后执行rm -r命令,出现这个问题,标记为红色的部分意思是namenode是安全节点, [master@hadoop file]$ hadoop fs -rm -r  /inp ...

  10. Isolate-user-vlan技术白皮书

    http://www.h3c.com.cn/Products___Technology/Technology/LAN/Other_technology/Technology_book/200804/6 ...