这个题就是题意不好理解。。。 题意:给定一个矩阵T=
输入数据中所给的矩阵为s,求T*s
但是在矩阵相乘时 乘以1 数据不变;乘以2 左移一位;乘以3左移一位再异或移位之前的矩阵;另外加法运算定义为异或运算。
注意:在移位过程中如果大于0xff,则需再异或0x1b。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int Matrix[4][4]={2,3,1,1,
1,2,3,1,
1,1,2,3,
3,1,1,2};
int ma[4][4],mb[4][4];
int main()
{
int t,i,j,x,y,cas=0,tt;
scanf("%d",&t);
tt=t;
while(t--)
{
cas++;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
scanf("%X",&ma[i][j]);
}
memset(mb,0,sizeof(mb));
/* int a=ma[0][0]<<1;
int b=ma[0][1];
int c=ma[0][2];
int d=(ma[0][3]<<1)^(ma[0][3]);
int e=a+b+c+d;
printf("%x %x %x %x %x\n",a,b,c,d,e);*/
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
for(x=0;x<4;x++)
{
if(Matrix[i][x]==1)
mb[i][j]=ma[x][j]^mb[i][j];
if(Matrix[i][x]==2)
{
int tmp=ma[x][j]<<1;
if(tmp>0xFF)
tmp=tmp^0x1B;
mb[i][j]=tmp^mb[i][j];
}
if(Matrix[i][x]==3)
{
int tmp=ma[x][j]<<1;
if(tmp>0xFF)
tmp=tmp^0x1B;
int temp=tmp^(ma[x][j]);
mb[i][j]=mb[i][j]^temp;
}
}
}
for(i=0;i<4;i++)
{
mb[i][0]%=16*16;//注意,题目要求保留十六进制后两位!!!
printf("%02X",mb[i][0]);
for(j=1;j<4;j++)
{
mb[i][j]%=16*16;
printf(" %02X",mb[i][j]);
}
printf("\n");
}
if(cas!=tt)
printf("\n");
}
return 0;
}