【题目大意】:给出数字范围r,n个矩阵,和m个查询,每个查询第i个矩阵到第j个矩阵的乘积,且乘后不超过r。
【解题思路】:利用线段树进行优化。
原来case与case直接的矩阵也要有空行...-_-!!!!!我无限PE啊....
【代码】:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
using namespace std;
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long
struct Mart{
int mat[4][4];
}Mar[2*32768+1];
int r,n,m;
Mart mart_multiply(Mart a,Mart b){
Mart c;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++){
c.mat[i][j]=0;
for(int k=0; k<2; k++)
c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j]%r)%r;
}
return c;
}
Mart query(int p,int le,int ri,int l,int r){
if (le==l && ri==r) return Mar[p];
int mid=(le+ri)>>1;
if (r<=mid) return query(lc(p),le,mid,l,r);
else if (l>mid) return query(rc(p),mid+1,ri,l,r);
Mart ans;
ans=mart_multiply(query(lc(p),le,mid,l,mid),query(rc(p),mid+1,ri,mid+1,r));
return ans;
}
int main() {
bool flag=false;
while (~scanf("%d%d%d",&r,&n,&m)){
int tmp=1;
while (tmp<n) tmp<<=1;
for (int i=0; i<n; i++){
for (int j=0; j<2; j++){
for (int l=0; l<2; l++)
scanf("%d",&Mar[tmp+i].mat[j][l]);
}
}
for (int i=tmp-1; i>0; i--){
Mar[i]=mart_multiply(Mar[lc(i)],Mar[rc(i)]);
}
for (int i=0; i<m; i++){
int l,r;
if (flag) printf("\n");
else flag=true;
scanf("%d%d",&l,&r);
Mart ans;
ans=query(1,1,tmp,l,r);
for (int j=0; j<2; j++){
printf("%d %d\n",ans.mat[j][0],ans.mat[j][1]);
}
}
}
return 0;
}