题目:给定一个矩阵op=
再给你一个矩阵a,求op*a。
在矩阵相乘时 乘以1 数据不变;乘以2 左移一位;乘以3左移一位再异或移位之前的矩阵;加法运算定义为异或运算。在移位过程中如果大于0xff,则需再异或0x1b。
思路:模拟矩阵相乘
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
int op[4][4]={2,3,1,1,
1,2,3,1,
1,1,2,3,
3,1,1,2};
int a[4][4],b[4][4];
int main(){
int T;
scanf("%d",&T);
while(T--){
mm(b,0);
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
scanf("%X",&a[i][j]);
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++){
if(op[i][k]==1){
b[i][j]^=a[k][j];
}
else if(op[i][k]==2){
int tmp=a[k][j]<<1;
if(tmp>0xFF)
tmp^=0x1B;
b[i][j]^=tmp;
}
else{
int tmp=a[k][j]<<1;
if(tmp>0xFF)
tmp^=0x1B;
tmp^=a[k][j];
b[i][j]^=tmp;
}
}
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
b[i][j]%=16*16;
printf("%02X%c",b[i][j],j==3?'\n':' ');
}
if(T!=0)
printf("\n");
}
return 0;
}