zoukankan      html  css  js  c++  java
  • UVA 11149-Power of Matrix(等比矩阵求和)

    给定一个矩阵A 要求A + A^2 + A^3 +…. A^k; 
    对于到n的等比矩阵求和 
    如果n是偶数: 
    这里写图片描述 
    如果n是奇数: 
    这里写图片描述

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    
    const int maxn = 45;
    int mod = 10;
    int n, k;
    
    struct matrix {
        int mat[maxn][maxn];
    };
    
    matrix mat_add(matrix A, matrix B) {
        matrix ans;
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                ans.mat[i][j] = A.mat[i][j] + B.mat[i][j];
                ans.mat[i][j] %= mod;
            }
        }
        return ans;
    }
    
    matrix mat_mul(matrix A, matrix B) {
        matrix ans;
        memset(ans.mat, 0, sizeof(ans.mat));
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                for(int k=0; k<n; k++) {
                    ans.mat[i][j] += A.mat[i][k] * B.mat[k][j];
                    ans.mat[i][j] %= mod;
                }
            }
        }
        return ans;
    }
    
    matrix mat_pow(matrix A, int b) {
        matrix ans;
        matrix p = A;
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                ans.mat[i][j] = (i == j);
            }
        }
        while(b) {
            if(b & 1)
                ans = mat_mul(ans, p);
            p = mat_mul(p, p);
            b >>= 1;
        }
        return ans;
    }
    
    matrix work(matrix A, int m) {
        if(m == 1)
            return A;
        matrix t = work(A, m/2);
        if(m & 1) {
            matrix cur = mat_pow(A, m/2+1);
            t = mat_add(t, mat_mul(t, cur));
            t = mat_add(t, cur);
        } else {
            matrix cur = mat_pow(A, m/2);
            t = mat_add(t, mat_mul(t, cur));
        }
        return t;
    }
    
    int main() {
        while(scanf("%d%d", &n, &k), n) {
            matrix A;
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    int x;
                    scanf("%d", &x);
                    A.mat[i][j] = x % 10;
                }
            }
            matrix ans = work(A, k);
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    printf("%d%c", ans.mat[i][j], j==n-1 ? '
    ' : ' ');
                }
            }
            printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    sparql学习sparql示例、dbpedia在线验证
    中国绿卡
    逾期率的水有多深,你知道吗?
    ICO和区块链区别
    What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?
    Link static data in sql source control
    sql data compare
    viewbag
    多态的实际使用
    win10 sedlauncher.exe占用cpu处理
  • 原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/9148304.html
Copyright © 2011-2022 走看看