题意:已知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 ;
}

最新文章

  1. 详解JavaScript中的this
  2. Hibernate映射文件如何配置触发器
  3. ant copy file
  4. .net解决数据导出excel时的格式问题
  5. Java使用Jdbc操作MySql数据库(一)
  6. 关于高并发的aotomic
  7. 2、SQL基础整理(聚合函数)
  8. Class类文件结构、类加载机制以及字节码执行
  9. 对于js原型和原型链继承的简单理解(第三种,复制继承)
  10. 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)
  11. PyQt4 开发入门
  12. Linux 操作之基础命令
  13. OpenCV4.1.0实践(1) - 环境配置及使用
  14. win2003 创建nds辅助服务器 步骤
  15. HDOJ2013_蟠桃记
  16. 为ElasticSearch添加HTTP基本认证
  17. 20155308《网络对抗》Exp6 信息搜集与漏洞扫描
  18. 浅谈Java中的初始化和清理
  19. 杂项-frame:Rails框架
  20. vsearch 去除重复序列和singleton 序列

热门文章

  1. 解决css中display:inline-block产生的空隙问题
  2. Redis详解(一)——RDB
  3. python内置函数二
  4. 在GNOME开发人员的努力下,Pango 1.44即将问世
  5. linux7下nenux3.14的maven私服搭建和配置使用
  6. LabVIEW面向对象的ActorFramework(2)
  7. 007-PHP变量和函数相互转换
  8. Python中语法糖及带参语法糖
  9. 【剑指Offer】面试题32 - III. 从上到下打印二叉树 III
  10. 树莓派3b安装Windows10 Arm