zoukankan      html  css  js  c++  java
  • BZOJ 3503: [Cqoi2014]和谐矩阵

    二次联通门 : BZOJ 3503: [Cqoi2014]和谐矩阵

    感觉头疼的快爆炸了。。。

    /*
        BZOJ 3503: [Cqoi2014]和谐矩阵
    
        高斯消元
    
        把第一行的M个数看做是未知数
        那么下面的每个位置的数就被间接确定了
        然后高斯消元即可
    */
    #include <cstdio>
    #include <iostream>
    #include <bitset>
    
    #define rg register
    #define Max 52
    
    std :: bitset <Max> m[Max];
    typedef long long LL;
    LL a[Max][Max]; 
    int b[Max][Max];
    
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    void Gauss (int N, int M)
    {
        rg int i, j, n = 0, k;
        for (i = 1; i <= M; ++ i)
        {
            for (j = n + 1; m[j][i] == 0 && j <= M; ++ j);
            if (j == M + 1) continue;
            for (++ n, std :: swap (m[j], m[n]), k = n + 1; k <= M; ++ k)
                if (m[k][i] != 0) m[k] ^= m[n];
        }
        for (i = M; i >= 1; -- i)
        {
            b[1][i] = m[i][M + 1];
            if (m[i][i] == 0) { b[1][i] = 1; continue; }
            for (j = i + 1; j <= M; ++ j)
                if (m[i][j]) b[1][i] ^= b[1][j];
        }
    }
    
    int main (int argc, char *argv[])
    {
        int N, M; read (N), read (M); rg int i, j;
        for (i = 1; i <= M; ++ i)
            a[1][i] = (LL) 1 << (i - 1);
        for (i = 2; i <= N + 1; ++ i)
            for (j = 1; j <= M; ++ j)
                a[i][j] = a[i - 2][j] ^ a[i - 1][j - 1] ^ a[i - 1][j + 1] ^ a[i - 1][j];
        for (i = 1; i <= M; ++ i)
        {
            for (j = 1; j <= M; ++ j)
                m[i][j] = ((LL) 1 << (j - 1) & a[N + 1][i]) ? 1 : 0;
            m[i][M + 1] = 0;
        }
        for (Gauss (N, M), i = 2; i <= N; ++ i)
            for (j = 1; j <= M; ++ j)
                b[i][j] = b[i - 2][j] ^ b[i - 1][j - 1] ^ b[i - 1][j + 1] ^ b[i - 1][j];
    
        for (i = 1; i <= N; ++ i)
            for (j = 1; j <= M; ++ j)
                if (j != M) printf ("%d ", b[i][j]);
                else printf ("%d
    ", b[i][j]);
    
        return 0;
    }
  • 相关阅读:
    python中list添加元素的方法append()、extend()和insert()
    Python中的短路计算
    Python文件的读写
    Python匿名函数
    Python中的引用传参
    持续学习大纲
    【Mysql】Datetime和Timestamp区别,及mysql中各种时间的使用
    【JDK源码】 ☞ HashMap源码分析及面试汇总
    算法复杂度实例 -- O(1) O(n) O(logN) O(NlogN)
    Solr使用总结
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/8080759.html
Copyright © 2011-2022 走看看