题意:已知n个矩阵(下标从1开始),求下标x~y区间矩阵的乘积。最多m次询问,n ( 1 <= n <= 30,000) and m ( 1 <= m <= 30,000)。

分析:

1、矩阵初始化为单位矩阵,因为要做乘积,E*A=A。

2、因为输出矩阵的所有值范围在0~r-1,所以要对r取余。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long ll;
typedef unsigned long long llu;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {, , -, , -, -, , };
const int dc[] = {-, , , , -, , -, };
const int MOD = 1e4;
const double pi = acos(-1.0);
const double eps = 1e-;
const int MAXN = + ;
const int MAXT = + ;
using namespace std;
struct Matrix{
int ma[][];
Matrix(){
ma[][] = ma[][] = ;
ma[][] = ma[][] = ;
}
}num[MAXN << ];
int r;
Matrix mul(Matrix a, Matrix b){
Matrix ans;
for(int i = ; i < ; ++i){
for(int j = ; j < ; ++j){
ans.ma[i][j] = ;
for(int k = ; k < ; ++k){
(ans.ma[i][j] += (a.ma[i][k] * b.ma[k][j]) % r) %= r;
}
}
}
return ans;
}
void add_up(int id){
num[id] = mul(num[id << ], num[id << | ]);
}
void add(int l, int r, int cur, Matrix x, int id){
if(l == r){
num[id] = x;
return;
}
int mid = (l + r) >> ;
if(cur <= mid){
add(l, mid, cur, x, id << );
}
else add(mid + , r, cur, x, id << | );
add_up(id);
}
Matrix query(int L, int R, int l, int r, int id){
if(l >= L && r <= R){
return num[id];
}
int mid = (l + r) >> ;
Matrix ans;
if(L <= mid){
ans = mul(ans, query(L, R, l, mid, id << ));
}
if(R >= mid + ){
ans = mul(ans, query(L, R, mid + , r, id << | ));
}
return ans;
}
int main(){
int n, m;
bool flag = true;
while(scanf("%d%d%d", &r, &n, &m) == ){
if(flag) flag = false;
else printf("\n");
for(int i = ; i <= n; ++i){
Matrix tmp;
for(int j = ; j < ; ++j){
for(int k = ; k < ; ++k){
scanf("%d", &tmp.ma[j][k]);
}
}
add(, n, i, tmp, );
}
while(m--){
int x, y;
scanf("%d%d", &x, &y);
Matrix t = query(x, y, , n, );
printf("%d %d\n", t.ma[][], t.ma[][]);
printf("%d %d\n", t.ma[][], t.ma[][]);
if(m) printf("\n");
}
}
return ;
}

ZOJ - 2671 Cryptography(线段树+求区间矩阵乘积)的更多相关文章

  1. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  2. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

  3. hdu 1754 I Hate It (线段树求区间最值)

    HDU1754 I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u D ...

  4. 【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps

    https://nanti.jisuanke.com/t/30996 线段树维护区间最小值,查询的时候优先向左走,如果左边已经找到了,就不用再往右了. 一个房间装满则把权值标记为INF,模拟一遍,注意 ...

  5. poj 3264 线段树 求区间最大最小值

    Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...

  6. BZOJ 4127: Abs (树链剖分 线段树求区间绝对值之和 带区间加法)

    题意 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d(d>=0) 2 u v 表示询问路径 (u,v) 上点权绝对值的和 分析 绝对值之和不好处理,那么我们开 ...

  7. HDU6447 YJJ's Salesman-2018CCPC网络赛-线段树求区间最值+离散化+dp

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  1e5个点,问 ...

  8. hdu1166 敌兵布阵(线段树 求区间和 更新点)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. POJ3264(线段树求区间最大最小值)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 41162   Accepted: 19327 ...

随机推荐

  1. The Proof of Fibonacci GCD

    \[\Large \text{The Proof of Fibonacci GCD}\] \[\text{By Sangber}\] \(\text{Fibonacci Sequence}\) \(\ ...

  2. 【Go语言系列】2.1、Go语言基本程序结构:注释

    注释在程序中的作用是对程序进行注解和说明,便于对源码的阅读.在源码中适当地添加注释,能够提高源码的可读性. Go语言的注释主要分成两类,分别是单行注释和多行注释. 单行注释: //单行注释 多行注释: ...

  3. 088、Java中String类之对象直接赋值

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. golang Context for goroutines

    概要 goroutine 的控制 取消控制 超时控制 goroutine 之间的传值 总结 概要 golang 的提供的 channel 机制是基于 CSP(Communicating Sequenc ...

  5. MyEclipse插件github安装使用

    MyEclipse插件github安装使用   网络上的介绍一堆堆的,但是自己尝试了下,发现问题很多,就动手做个教程. 大纲 1.git客户端安装 2.ssh配置 3.egit安装配置 4.参考资料 ...

  6. LINQ---查询语法和方法语法

    namespace ConsoleApplication45 { class Program { static void Main(string[] args) { , , , , , , }; va ...

  7. FBV CBV

    目录 CBV 和 FBV 介绍 路由绑定 urlpatterns = [ # 1)项目启动,将test函数地址绑定给/test/路由 # 2)请求/test/访问后台,后台就会调用绑定的test函数 ...

  8. Timetable CodeForces - 946D (预处理+背包)

    题意:n天m节课,最多可以逃k节课,每天在学校待的时间为该天上的第一节课到最后一节课持续的时间.问怎样逃课可以使这n天在学校待的时间最短,输出最短的时间. 分析: 1.预处理出每天逃j节课时在学校待的 ...

  9. Linux系统-----包管理器的演变

    每个电脑设备都使用某种形式的软件来执行其预定任务.在软件开发的早期,对产品进行了严格的bug和其他缺陷测试.在过去的十多年里,软件通过互联网发布,目的是通过应用新版本的软件来修复任何错误.在某些情况下 ...

  10. PyCharm配置TensorFlow开发环境

    Anaconda自带的Jupyter Notebook很方便,但是执行速度较慢,缺少调试环境.PyCharm与Jupyter Notebook相比,执行速度更快,而且提供了类似Matlab的调试工具, ...