zoukankan      html  css  js  c++  java
  • hdu 2276矩阵快速幂

    根据题意构造变换矩阵即可。有很多构造矩阵的方法。例如,假设原串长度为7,则我构造的矩阵M如下:

    1 1 0 0 0 0 0

    0 1 1 0 0 0 0

    0 0 1 1 0 0 0

    0 0 0 1 1 0 0

    0 0 0 0 1 1 0

    0 0 0 0 0 1 1

    1 0 0 0 0 0 1

    每次用M右乘原始矩阵就相当于一次变换,用快速幂就可以过了。不过这道题测试数据有点坑爹,我直接用的矩阵模板,超时,手动把矩阵乘法部分改成位运算形式就过了。。。估计之前超时也就超那么一丁点吧,估计加个输入外挂也能过。。。

    /*
     * hdu2276/win.cpp
     * Created on: 2012-11-3
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    const int MAX_ORDER = 105;
    typedef bool typec;
    typedef struct MyMatrix {
        int order;
        typec num[MAX_ORDER][MAX_ORDER];
        MyMatrix(int ord) {
            order = ord;
        }
        void init() {
            for (int i = 0; i < order; i++) {
                for (int j = 0; j < order; j++) {
                    num[i][j] = 0;
                }
            }
        }
    } MyMatrix;
    MyMatrix operator*(MyMatrix ma, MyMatrix mb) {
        int ord = ma.order;
        MyMatrix numc(ord);
        numc.init();
        int i, j, k;
        for (i = 0; i < ord; i++) {
            for (j = 0; j < ord; j++) {
                for (k = 0; k < ord; k++) {
                    numc.num[i][j] = numc.num[i][j] xor (ma.num[i][k] and mb.num[k][j]);
                }
            }
        }
        return numc;
    }
    MyMatrix mpow(MyMatrix ma, int x) {
        int ord = ma.order;
        MyMatrix numc(ord);
        numc.init();
        for (int i = 0; i < ord; i++) {
            numc.num[i][i] = 1;
        }
        for (; x; x >>= 1) {
            if (x & 1) {
                numc = numc * ma;
            }
            ma = ma * ma;
        }
        return numc;
    }
    
    MyMatrix getTraMatix(int n) {
        MyMatrix ret(n);
        ret.init();
        for(int j = 0; j < n; j++) {
            int i = (j - 1 + n) % n;
            ret.num[j][j] = 1;
            ret.num[i][j] = 1;
        }
        return ret;
    }
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        int m;
        char str[200];
        while(scanf("%d", &m) == 1) {
            getchar();
            gets(str);
            int len = strlen(str);
            MyMatrix ori(len);
            ori.init();
            for(int i = 0; i < len; i++) {
                ori.num[0][i] = str[i] - '0';
            }
            MyMatrix tra = mpow(getTraMatix(len), m);
            MyMatrix result = ori * tra;
            for(int i = 0; i < len; i++) {
                printf("%d", result.num[0][i]);
            }
            putchar('\n');
        }
        return 0;
    }
  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/moonbay/p/2752585.html
Copyright © 2011-2022 走看看