uva 11149 - Power of Matrix 【倍增 + 矩阵快速幂】

来源:互联网 发布:4g逛淘宝用多少流量 编辑:程序博客网 时间:2024/04/30 22:25

题意:给你一个n*n的矩阵A,现在要你求出矩阵A + A^1 + A^2 + ... + A^k。 只输出最后一位数字。


思路:倍增法

对于矩阵res = A + A^1 + ... + A^k

若k&1,则有res = (A + A^1 + ... + A^(k/2)) + (A + A^1 + ... + A^(k/2)) * A^(k/2) + A^k。

若k%2==0,则有res = (A + A^1 + ... + A^(k/2)) + (A + A^1 + ... + A^(k/2)) * A^(k/2)。


构造好矩阵就可以了,注意每组数据之间要输一组空行。


AC代码:


#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <set>#include <vector>#define INF 0x3f3f3f3f#define eps 1e-8#define MAXN (200+10)#define MAXM (100000)#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%.2lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define LL long long#define lson o<<1, l, mid#define rson o<<1|1, mid+1, r#define ll o<<1#define rr o<<1|1using namespace std;struct Matrix{    int a[50][50];    int r, c;};Matrix ori, res;Matrix initMatrix(int n){    Matrix x;    x.r = x.c = n;    for(int i = 0; i < n; i++)    {        for(int j = 0; j < n; j++)        {            int y; Ri(y);            x.a[i][j] = y % 10;        }    }    return x;}Matrix GetMatrix(int r, int c){    Matrix x;    CLR(x.a, 0); x.r = r; x.c = c;    for(int i = 0; i < r; i++)        x.a[i][i] = 1;    return x;}Matrix multi(Matrix x, Matrix y){    Matrix z; CLR(z.a, 0);    z.r = x.r; z.c = y.c;    for(int i = 0; i < x.r; i++)    {        for(int k = 0; k < x.c; k++)        {            if(x.a[i][k] == 0) continue;            for(int j = 0; j < y.c; j++)                z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j]) % 10;        }    }    return z;}Matrix add(Matrix x, Matrix y){    Matrix z;    z.r = x.r; z.c = y.c;    for(int i = 0; i < x.r; i++)        for(int j = 0; j < y.c; j++)            z.a[i][j] = (x.a[i][j] + y.a[i][j]) % 10;    return z;}Matrix Pow(Matrix x, int n){    Matrix y = GetMatrix(x.r, x.c);    while(n)    {        if(n & 1)            y = multi(x, y);        x = multi(x, x);        n >>= 1;    }    return y;}Matrix Print(Matrix x){    for(int i = 0; i < x.r; i++)    {        for(int j = 0; j < x.c; j++)        {            if(j) printf(" ");            printf("%d", x.a[i][j]);        }        printf("\n");    }    printf("\n");}Matrix WorkMatrix(Matrix x, int k){    Matrix a, b, z;    if(k == 1)        return x;    a = WorkMatrix(x, k/2);    b = multi(a, Pow(x, k/2));    z = add(a, b);    if(k & 1)        z = add(z, Pow(x, k));    return z;}int main(){    int n, k;    while(scanf("%d%d", &n, &k) != EOF)    {        if(n == 0) break;        ori = initMatrix(n);        res = WorkMatrix(ori, k);        Print(res);    }    return 0;}


0 0
原创粉丝点击