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
  • 相关阅读:
    Golang哲学思想
    Outlook与Hotmail的设置
    Android 经验: 5555 端口会被 adb 误认为 emulator
    QT程序探测所需DLL,静态连接和打包
    VS编译的QT程序发布时产生的AppCrash问题
    新语言和旧语言
    MMU和TLB
    FMX的综合评价
    Windows核心编程学习九:利用内核对象进行线程同步
    QListWidget特别简单,但有两种添加item的方式
  • 原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/9148304.html
Copyright © 2011-2022 走看看