当前位置: 首页 > 编程日记 > 正文

cf-Sasha and Array

题目链接 http://codeforces.com/problemset/problem/719/E

解题思路

矩阵上的线段树。

因为矩阵有分配律(A+B)C = AC + BC,所以计算总和时直接把增量矩阵乘上去就行了。用矩阵快速幂。

fib的计算尽量拉到主函数计算。

代码

#include<stdio.h>
#include<string.h>#define MAX_SIZE 100010
const int MOD_NUM = 1e9 + 7;
typedef long long ll;
struct mat {mat() {}mat(int a, int b, int c, int d){ ans[0][0] = a; ans[0][1] = b; ans[1][0] = c; ans[1][1] = d; } int ans[2][2];bool JudgeOne(){for(int i=0; i<2; i++)for(int j=0; j<2; j++)if(i == j && ans[i][j] != 1 || i != j && ans[i][j] != 0)return false;return true;}void SetOne(){for(int i=0; i<2; i++)for(int j=0; j<2; j++)ans[i][j] = (i == j) ? 1 : 0;}mat operator *(const mat &b)const{mat c(0,0,0,0);for(int k=0; k<2; k++)for(int i=0; i<2; i++)for(int j=0; j<2; j++)c.ans[i][j] = (c.ans[i][j] + (ll)ans[i][k] * b.ans[k][j]) % MOD_NUM;return c;}mat operator +(const mat &b)const{mat c;for(int i=0; i<2; i++)for(int j=0; j<2; j++)c.ans[i][j] = (ans[i][j] + b.ans[i][j]) % MOD_NUM; return c;}
};
struct node {mat sum; mat tempt;    
}tree[4*MAX_SIZE];
mat a[MAX_SIZE];
mat temp;
mat cal_fib(int x)
{mat c; mat t(0,1,1,1);c.SetOne();while(x) {if(x & 1) c = c * t;t = t * t;x  = x >> 1;}return c;
}
void build(int l, int r, int root)
{tree[root].tempt.SetOne();if(l == r) {tree[root].sum = a[l];return ;}int mid = (l + r) / 2;build(l, mid, root*2);build(mid+1, r, root*2+1);tree[root].sum = tree[root*2].sum + tree[root*2+1].sum;
}
void down(int root)
{tree[root*2].sum = tree[root*2].sum * tree[root].tempt;tree[root*2].tempt = tree[root*2].tempt * tree[root].tempt;tree[root*2+1].sum = tree[root*2+1].sum * tree[root].tempt;tree[root*2+1].tempt = tree[root*2+1].tempt * tree[root].tempt;tree[root].tempt.SetOne();
}
void query_1(int l, int r, int L, int R, int root, mat value)
{if(L == l && r == R) {tree[root].tempt = tree[root].tempt * value;tree[root].sum = tree[root].sum * value;return ;}if(!tree[root].tempt.JudgeOne()) {down(root);}int mid = (L + R) / 2;if(r <= mid) query_1(l, r, L, mid, root*2, value);else if(l > mid) query_1(l, r, mid+1, R, root*2+1, value);else {query_1(l, mid, L, mid, root*2, value);query_1(mid+1, r, mid+1, R, root*2+1, value);}tree[root].sum = tree[root*2].sum + tree[root*2+1].sum;
}
int query_2(int l, int r, int L, int R, int root)
{if(L == l && r == R) {return tree[root].sum.ans[0][1];}if(!tree[root].tempt.JudgeOne()) {down(root);}int ret = 0;int mid = (L + R) / 2;if(r <= mid) ret = query_2(l, r, L, mid, root*2);else if(l > mid) ret = query_2(l, r, mid+1, R, root*2+1);else {ret = query_2(l, mid, L, mid, root*2) + query_2(mid+1, r, mid+1, R, root*2+1) % MOD_NUM;}return ret % MOD_NUM;
}
int main()
{int n, m, d;scanf("%d%d", &n, &m);for(int i=1; i<=n; i++) {mat base(0, 1, 1, 1);scanf("%d", &d); a[i] = cal_fib(d);}build(1, n, 1);for(int i=0; i<m; i++) {int type, l, r, x;scanf("%d", &type);if(type == 1) {mat base(0, 1, 1, 1);scanf("%d%d%d", &l, &r, &x);temp = cal_fib(x);query_1(l, r, 1, n, 1, temp);}else {scanf("%d%d", &l, &r);printf("%d\n", query_2(l, r, 1, n, 1));}}return 0;
}

转载于:https://www.cnblogs.com/ZengWangli/p/5933256.html

相关文章:

实对称矩阵的性质_浅谈矩阵的相似对角化(一)

森屿瑾年&#xff1a;浅谈线性变换和矩阵之间的关系​zhuanlan.zhihu.com通过前面的讨论&#xff0c;我们引出了线性变换在不同基下的矩阵之间的关系&#xff0c;知道了线性变换在不同基下的矩阵是相似的&#xff0c;进而我们可以通过选取不同的基&#xff0c;使得线性变换在这…

区块链技术未来可能用于哪些方面?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 当世界上从100比特币购买25美分的比萨饼&#xff0c;到一比特币兑换4800人民币的天价&#xff0c;在这风起云涌的纪念&#xff0c;我们见证了一个…

tomcat启动

tomcat的启动一般是从startup.bat/startup.sh开始&#xff0c;然后启动catalina.bat/catalina.sh&#xff0c;然后启动bootstrap.jar包 那么它们启动的时候都做了哪些事情呢&#xff1f; 首先是startup.bat&#xff0c;startup.bat做了什么&#xff1f; 第二是catalina.bat&…

ERROR: from PIL import Image ImportError: No module named PIL

ERROR&#xff1a; from PIL import Image ImportError: No module named PIL 到 http://www.pythonware.com/products/pil/ 下载相关支持的版本 我的是python2.7 直接打开&#xff0c;然后一路按“下一步”&#xff0c;就行 转载于:https://www.cnblogs.com/jakejian/p/8992…

python中font_Python ColorFont包_程序模块 - PyPI - Python中文网

控制台打印彩色字体0 黑色 8 灰色1 蓝色 9 淡蓝色2 绿色 A 淡绿色3 浅绿色 B 淡浅绿色4 红色 C 淡红色5 紫色 D 淡紫色6 黄色 E 淡黄色7 白色 F 亮白色格式&#xff1a;0x12高位代表背景色&#xff0c;低位代表字体颜色0x10 | 0x020x10代表背景色&#xff0c;0…

区块链技术到底有啥用?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 前言&#xff1a;关于区块链适合做什么和不适合做什么&#xff1f;一直都有争议。那么&#xff0c;通过什么方式来辨别呢&#xff1f;本文用详细的…

博客作业04--树

一.学习总结(2分) 1.1树结构思维导图 1.2 树结构学习体会 树的前中后序递归操作的访问路径都如下图 树的层次遍历的路径则如下图 操作{ 进队第一个节点&#xff0c; while(队不空&#xff09; { 访问该节点&#xff0c; if(BT->lchild&#xff01;NULL&#xff09;进队。 if…

oracle数据如何获取游标中动态字段_如何实现报表数据的动态层次钻取(二)

上一篇《如何实现报表数据的动态层次钻取&#xff08;一&#xff09;》介绍了利用复杂 sql 实现动态层次结构的方法&#xff0c;但该方法依赖 Oracle 的递归语法&#xff0c;在其他类型的数据库中难以实现。要想通用地实现此类报表&#xff0c;可以使用下面介绍的“集算脚本 本…

使用jsonp跨域请求后可以获得数据,但是进入error方法,返回parseerror

$.ajax({ url:url, dataType:jsonp, jsonp: callback,//回调函数名字 jsonpCallback: success_jsonpCallback,//可以不写&#xff0c;也可以自定义&#xff0c;用来取代 jQuery 自动生成的随机函数名&#xff0c;不写将由jq自动生成&#xff0c;每次生成的结果都不…

EOS技术学习笔记

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS.IO软件引入了一种新的块链架构&#xff0c;旨在实现分布式应用的性能扩展。这是通过创建一个可以构建应用程序的类似操作系统的架构来实现的。…

PHP的一种缓存方案静态化

1,解决的问题。 2.如何实现。 面对大流量网站频繁访问数据库的一种优化&#xff0c;比如博客网站。不可能每个人查看都访问一次数据库。为了解决大量不必要访问的问题。 可以把第一次的内容保存为html页面。再以后定义的过期时间内都访问该静态页面。 以下是一个小的demo index…

python获取机器唯一标识_开发中常用工具 - 获取设备的唯一标识、UDID、UUID、keychain保存UUID、判断网络...

UDID全名&#xff1a;Unique Device Identifie(设备唯一标识符)说明&#xff1a;UDID&#xff0c;即设备唯一标识符&#xff0c;这是除序列号之外每台iOS设备的独一无二的号码。UDID只是和设备相关的&#xff0c;是用来区分每一个唯一的iOS设备(包括iPhone、iPad等)&#xff0c…

区块链安全入门笔记

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 虽然有着越来越多的人参与到区块链的行业之中&#xff0c;然而由于很多人之前并没有接触过区块链&#xff0c;也没有相关的安全知识&#xff0c;安…

PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者&#xff1a;黑夜路人&#xff08;2014/10/15&#xff09; 按照了解的很多PHP/LNMP程序员的发展轨迹&#xff0c;结合个人经验体会&#xff0c;抽象出很多程序员对未来的迷漫&#xff0c;特别对技术学习的盲目和慌乱&#xff0c;简单梳理了这个每个…

【资源共享】RK3288 WiFiBT 开发配置参考说明

本文档主要介绍RK3288平台的WiFi&BT配置说明。 下载地址&#xff1a;http://dev.t-firefly.com/thread-13642-1-1.html更多开发资料请到社区精华系列“资源共享”专栏下载http://dev.t-firefly.com/forum-263-1.html转载于:https://www.cnblogs.com/TeeFirefly/p/9001757.h…

软件工程实训有必要吗_人工智能专业值得读吗?就业如何?

要说这几年的风口&#xff0c;人工智能首当其冲。热门是否代表了好就业&#xff1f;我觉得不是&#xff1b;那是不是就不好就业&#xff1f;我觉得也不是。先来看看这些耸人听闻的标题吧——“人工智能人才缺口超过500万&#xff0c;补齐人才短板乃是当务之急“人工智能就业前景…

区块链共识算法:PoS即权益证明 DPoS委托授权的权益证明

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 随着比特币价格暴涨&#xff0c;基于比特币的区块链技术引起各方关注&#xff0c;其核心就是共识算法。随着区块链技术的发展共识算法也在不断创新与…

【洛谷P1697】货车运输

首先&#xff0c;对于所有从x能到达y的路径中&#xff0c;限重越大越好 因此我们用Kruskal最大生成树得到一片森林&#xff08;不一定都联通&#xff09; 之后dfs维护森林的深度和LCA的预处理limit[x][0]&#xff08;x向上跳2^i步的边权最小值&#xff09; 对于每个询问&…

win7上Docker使用

1、启动docker&#xff1a; Docker Quickstart Terminal &#xff08;快捷键&#xff09;启动docker 2、SECURECRT工具链接docker&#xff1a; 转载于:https://www.cnblogs.com/aibaiyang/p/9007074.html

qt4的quick程序升级到qt5_最新8月书单出炉!送给你程序员

&#xff18;月好书赏不停&#xff0c;喜欢的就收藏一下。&#xff11;、计算广告&#xff1a;互联网商业变现的市场与技术&#xff08;第2版&#xff09;作者&#xff1a;刘鹏、王超全球第一本全面讲解计算广告与互联网变现秘密的专业图书升级版北冥乘海生 刘鹏老师力作&#…

都说区块链颠覆未来,区块链究竟能改变什么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链&#xff0c;有时像个天使&#xff0c;有时像个魔鬼。 有人说它是金融泡沫&#xff0c;说他是彻底的庞氏骗局&#xff1b;有人说它能改变世界…

python银行家算法代码_避免死锁的银行家算法C++程序实现

&#xfeff;&#xfeff;本篇博文为追忆以前写过的算法系列第二篇(20081021)温故知新目的&#xff1a;具有代表性的死锁避免算法是Dijskstra给出的银行家算法。本实验是基于银行家算法的思想通过编写C程序实现银行家算法的计算机程序化。使其更有用。同一时候也加深了有关自愿…

shell脚本编程学习笔记(四)shell操作数据库

一、数据库基本操作 1&#xff09;登录mysql服务器&#xff1a;mysql -u root -p 密码 2&#xff09;查看数据库&#xff1a;show databases 3&#xff09;查看表&#xff1a;show tales from db; 4&#xff09;查看表结构&#xff1a;desc table; 5&#xff09;创建表&#xf…

WebFrom模拟MVC

如&#xff1a; aspx前台 这样写生成页面时不会产生新的html标签&#xff0c;用控件则会产生新的html标签 <h1><% title %></h1> <p><% content %></p><ul> <% foreach (string item in list){%> <li>…

区块链的未来在哪里

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 经历了早期的野蛮成长之后&#xff0c;区块链行业的发展开始回归理性客观的发展阶段。探索区块链对于互联网行业的支持作用&#xff0c;而非颠覆作…

Spring注解之 @EnableScheduling计划任务注解

要实现计划任务&#xff0c;首先通过在配置类注解EnableScheduling来开启对计划任务的支持&#xff0c; 然后在要执行计划任务的方法上注解Scheduled&#xff0c;声明这是一个计划任务 示例&#xff1a;计划任务执行类 在这个类中的方法上需要Scheduled注解配合EnableSchedulin…

python爬虫案例_推荐上百个github上Python爬虫案例

现在学生都对爬虫感兴趣&#xff0c;这里发现一些好的github开源的代码&#xff0c;分享给各位1、awesome-spider 该网站提供了近上百个爬虫案例代码&#xff0c;这是ID为facert的一个知乎工程师开源的&#xff0c;star6000https://github.com/facert/awesome-spider​github.c…

二元一次方程组

二元一次方程组&#xff08;C语言&#xff09; 学生&#xff1a;缪晓敏&#xff0c;施嘉依 #include <stdio.h>#include <math.h>int main() {double a1,b1,c1,a2,b2,c2,d,e,f;printf("a1 b1 c1 : ");scanf("%lf %lf %lf",&a1,&b1,&am…

超级账本(Hyperledger Fabric)源码分析之一:总览

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 一、编译 1、环境准备 需要提前在linux或者mac机器上安装如下软件 1&#xff09;Go&#xff0c;注意设置好gopath&#xff08;笔者安装的是go1.8…

建模与设计01

转载于:https://www.cnblogs.com/invisible2/p/9016732.html