UVA11149_Power of Matrix

题目简洁明了,给出矩阵,求前k次方和。

不知道这种方法是叫做二分幂还是倍增法,如果有知道的,请告诉我一下。

具体思想是这样的,A^1+A^2+A^3+......A^n=(E+A^(n/2))*(A^1+A^2+.....A^(n/2)),如果n为奇数,那么我们只要加上多余的哪一项就可以满足条件了,于是我们就通过这个公式不断的二分下去,用一个矩阵保存左边的矩阵的值,然后右边始终一直二分就可以了,整个复杂度是log^2的。

不过,我看别人的代码都比我跑得快,所以鄙人觉得应该有更简洁的方法,求指教啊。。。。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 44
using namespace std;

int N,m;

struct Mat{
    int a[44][44];
    Mat(){
        for (int i=0; i<N; i++)
            for (int j=0; j<N; j++) a[i][j]=0;
    }
    Mat(int x){
        for (int i=0; i<N; i++){
            for (int j=0; j<N; j++) a[i][j]=0;
            a[i][i]=1;
        }
    }
    Mat operator + (Mat M0) const {
        Mat M1;
        for (int i=0; i<N; i++)
            for (int j=0; j<N; j++) M1.a[i][j]=(a[i][j]+M0.a[i][j])%10;
        return M1;
    }
    Mat operator * (Mat M0) const {
        Mat M1;
        for (int i=0; i<N; i++)
            for (int j=0; j<N; j++)
                for (int k=0; k<N; k++)
                    M1.a[i][j]=(M1.a[i][j]+a[i][k]*M0.a[k][j])%10;
        return M1;
    }
    void input(){
        for (int i=0; i<N; i++)
            for (int j=0; j<N; j++) scanf("%d",&a[i][j]),a[i][j]%=10;
    }
    void output(){
        for (int i=0; i<N; i++){
            printf("%d",a[i][0]);
            for (int j=1; j<N; j++) printf(" %d",a[i][j]);
            printf("\n");
        }
        printf("\n");
    }
};

Mat power(Mat M,int P){
    Mat tot(1);
    while (P){
        if (P&1) tot=tot*M;
        P>>=1,M=M*M;
    }
    return tot;
}

Mat count(Mat M,int P){
    Mat M0,E(1),M1=E;
    while (P){
        if (P&1) M0=M0+M1*power(M,P);
        P>>=1;
        M1=M1*(E+power(M,P));
    }
    return M0;
}

int main(){
    Mat M;
    while (scanf("%d%d",&N,&m) && N!=0){
        M.input();
        M=count(M,m);
        M.output();
    }
    return 0;
}

UVA11149_Power of Matrix,布布扣,bubuko.com

时间: 2024-10-11 07:49:48

UVA11149_Power of Matrix的相关文章

hdu 5015 233 Matrix (矩阵快速幂)

题意: 有一种矩阵,它的第一行是这样一些数:a  0,0 = 0, a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333... 除此之外,在这个矩阵里, 我们有 a i,j = a i-1,j +a i,j-1( i,j ≠ 0).现在给你 a 1,0,a 2,0,...,a n,0, 你能告诉我a n,m 是多少吗? n,m(n ≤ 10,m ≤ 10 9)输出 a n,m mod 10000007. 思路:首先我们观察n和m的取值范围,会发现n非常小而m却非常大,如果

【数组】Spiral Matrix II

题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路: 本质上和上一题是一样的,这里我们要用数字螺旋的去填充矩阵.同理,我们也是逐个环

Spiral Matrix(LintCode)

Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. Example Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 难得的一次AC! 虽然感觉题

LeetCode:Spiral Matrix II - 将元素1-n^2以螺旋序填充到矩阵

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix-ii/ 3.题目内容 英文:Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. 中文:给出一个整数n,生成一个矩阵,使用数字1到n^2以螺旋顺序填充这个矩阵 例如:给出n=3,则生成如下矩阵:

LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix/ 3.题目内容 英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. 中文:给出一个m行n列的矩阵,以螺旋顺序返回矩阵中的所有元素. 例如:现有矩阵如下: [  [ 1,

HDU 2686 Matrix(最大费用流)

Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1890    Accepted Submission(s): 1005 Problem Description Yifenfei very like play a number game in the n*n Matrix. A positive integer numbe

UVA 11992(Fast Matrix Operations-线段树区间加&amp;改)[Template:SegmentTree]

Fast Matrix Operations There is a matrix containing at most 106 elements divided into r rows and c columns. Each element has a location (x,y) where 1<=x<=r,1<=y<=c. Initially, all the elements are zero. You need to handle four kinds of operati

U3D开发者福利 MATRIX : UNITY 游戏技术咨询免费开放

UNITE 2015 BEIJING 于2015年4月18日-20日,在北京国家会议中心隆重举行.在这场被媒体誉为"行业风向标"的大会上,Unity 大中华区总裁符国新提到2015年Unity 将在全球范围内着重发展线上增值服务,并宣布Unity 将在大中华区开启"Matrix 游戏技术咨询". Matrix -最专业的游戏技术咨询平台 Matrix 是由Unity 大中华区的技术咨询团队研发的,旨在帮助游戏团队更加方便.准确地定位和解决游戏开发过程中所遇到的性能问

LeetCode—*Spiral Matrix问题,主要是用到了方向矩阵,很创意

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 这是一个螺旋排序的问题 这里遇到一个比较巧妙的