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;
    }
  • 相关阅读:
    序列操作
    上帝造题的七分钟2 / 花神游历各国
    火柴排队
    pair(对组)用法
    线段树
    链上分治
    Rem与Px的转换
    css中单位px和em,rem的区别
    css网页自适应-1
    css网页自适应-2
  • 原文地址:https://www.cnblogs.com/Lyush/p/2639744.html
Copyright © 2011-2022 走看看