zoukankan      html  css  js  c++  java
  • HDU4364 Matrix operation

    简单矩阵...

    代码如下:

    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    unsigned int temp[5][5] = {
        {0, 0, 0, 0, 0},
        {0, 2, 3, 1, 1},
        {0, 1, 2, 3, 1},
        {0, 1, 1, 2, 3},
        {0, 3, 1, 1, 2}
    };
    
    unsigned int fix(unsigned int x)
    {
        if (x > 0xff) {
            x ^= 0x1b;
        }
        return x % (0xff+1);
    }
    
    unsigned int op(unsigned int b, unsigned int a)
    {
        if (b == 1) {
            return fix(a);    
        }
        else if (b == 2) {
            return fix(a << 1);    
        }
        else {
            return fix( fix(a << 1) ^ a );
        }
    }
    
    struct Matrix
    {
        unsigned int a[5][5];
        Matrix unit ()
        {
            Matrix ret;
            for (unsigned int i = 1; i <= 4; ++i) {
                ret.a[i][i] = 1;    
            }
            return ret;
        }
        void zero(){
            memset(a, 0, sizeof(a)); 
        }
        Matrix operator * (Matrix temp) const
        {
            Matrix ret; 
            ret.zero();
            for ( int i = 1; i <= 4; ++i) {
                for ( int j = 1; j <= 4; ++j) {
                    for ( int k = 1; k <= 4; ++k) {
                        ret.a[i][j] ^= op(a[i][k], temp.a[k][j]);
                        fix(ret.a[i][j]);
                    }
                }
            }
            return ret;
        }
        void read()
        {
            for ( int i = 1; i <= 4; ++i) {
                for ( int j = 1; j <= 4; ++j) {
                    scanf("%X", &a[i][j]);
                }
            }
        }
        void copy(unsigned int temp[][5])
        {
            for ( int i = 1; i <= 4; ++i) {
                for ( int j = 1; j <= 4; ++j) {
                    a[i][j] = temp[i][j];
                }
            }
        }
        void print()
        {
            for (int i = 1; i <= 4; ++i) {
                for (int j = 1; j <= 4; ++j) {
                    printf(j==1 ? "%02X" : " %02X", a[i][j]);
                }
                puts("");
            }
        }
    }M, S, ret;
    
    int main()
    {
        unsigned int T;
        scanf("%u", &T);
        while (T--) {
            M.read();
            S.copy(temp);
            ret = S * M;
            ret.print();
            if (T > 0) {
                puts("");
            }
        }
        return 0;
    }
  • 相关阅读:
    php与nginx配置,不能运行php程序
    奇葩php之数组
    奇葩之mysql
    for语法研究
    php short tag不显示排查
    奇葩之mysql【三】我只想获得一个自增Id,我容易吗我
    男女不同
    Restart explorer
    iOS面试贴士
    phpmyadmin万能登陆密码
  • 原文地址:https://www.cnblogs.com/Lyush/p/2639744.html
Copyright © 2011-2022 走看看