hdu 4364(矩阵相乘)

来源:互联网 发布:虚拟定位ios软件 编辑:程序博客网 时间:2024/06/05 19:42
题意:给你一个aes矩阵和另一个矩阵matri让这两个矩阵相乘,我们重新定义矩阵相乘:
1.相加用xor代替。
2.相乘要看aes中的值,
if 1: matri中的值不变。
if 2: matri中的值左移一位。
if 3: matri中的值左移一位,然后和左移前的值xor.
Notice:After each shifting, a conditional xor with 0x1B should be performed if the shifted value is larger than 0xFF.(这句话太坑爹了!!!)
这句话的大意是:如果左移后值大于0xFF,与0x1B xor,并对(0xFF + 1)取余。

思路:直接模拟。

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;int ans[5][5]={{2,3,1,1},{1,2,3,1},{1,1,2,3},{3,1,1,2}};int matrix[5][5];int a[5][5];void multi()//矩阵乘法{   for(int i=0;i<4;i++)//A的行   {       for(int j=0;j<4;j++)//A,B的列       {           for(int k=0;k<4;k++)//B的行           {              int t=matrix[k][j];              t<<=1;//左移一位              if(t>0xFF)//225              t=(t^0x1B)%(0xFF+1);              if(ans[i][k]==1)              {                  a[i][j]^=matrix[k][j];              }              else if(ans[i][k]==2)              {                  a[i][j]^=t;              }              else if(ans[i][k]==3)              {                  t^=matrix[k][j];                  a[i][j]^=t;              }           }       }   }}int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {        memset(a,0,sizeof(a));        for(int i=0;i<4;i++)        for(int j=0;j<4;j++)         scanf("%X",&matrix[i][j]);//输入        multi();        for(int i=0;i<4;i++)        {            for(int j=0;j<4;j++)            {              if(j!=0)              cout<<' ';              printf("%02X",a[i][j]);//大写十六进制,2位,不够前面补0            }          puts("");        }        if(cas != 0)        puts("");    }    return 0;}