题目链接: 传送门

Power of Matrix

Time Limit: 3000MS     

Description


给一个n阶方阵,求A1+A2+A3+......Ak。

思路

A1+A2+...+An = (A1+A2+...+An/2)+(A1+A2+...+An/2) * An/2 = (1 + An/2 ) * (A1+A2+...+An/2)那么对于 (A1+A2+...+An/2)也能用同样的方法去求,不断对半下去计算,最后总体复杂度为log(n)^2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 50;
const int mod = 10;

struct Matrix
{
    int mat[50][50];
    int r,c;
    Matrix(int r1 = 0,int c1 = 0):r(r1),c(c1)
    {
        memset(mat,0,sizeof(mat));
    }
    void E()
    {
        memset(mat,0,sizeof(mat));
        for (int i = 0;i < r;i++)
        {
            for (int j = 0;j < c;j++)
            {
                mat[i][j] = (i == j);
            }
        }
    }
    Matrix operator+(const Matrix & m)
    {
        Matrix res(r,c);
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                res.mat[i][j] = (mat[i][j] + m.mat[i][j])%mod;
            }
        }
        return res;
    }

    Matrix operator * (const Matrix & m)
    {
        Matrix res(r,m.c);
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < m.c; j++)
            {
                for (int k = 0; k < c; k++)
                {
                    res.mat[i][j] = (res.mat[i][j] + mat[i][k] * m.mat[k][j])%mod;
                }
            }
        }
        return res;
    }
    void show()
    {
        for (int i = 0;i < r;i++)
        {
            bool first = true;
            for (int j = 0;j < c;j++)
            {
                first?printf("%d",mat[i][j]):printf(" %d",mat[i][j]);
                first = false;
            }
            printf("\n");
        }
    }
};

Matrix pow(Matrix x,int n)
{
    Matrix res(x.r,x.c);
    res.E();
    while (n > 0)
    {
        if (n&1)
        {
            res = res * x;
        }
        x = x * x;
        n >>= 1;
    }
    return res;
}

Matrix sum(Matrix mat,int k)
{
    if (k == 1)
    {
        return mat;
    }
    Matrix E(mat.r,mat.c);
    E.E();
    if (k&1)
    {
        return (E + pow(mat,k/2))*sum(mat,k/2) + pow(mat,k);
    }
    else
    {
        return (E + pow(mat,k/2))*sum(mat,k/2);
    }
}

int main()
{
    int n,k;
    while (~scanf("%d%d",&n,&k) && n && k)
    {
        Matrix Mat(n,n);
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                scanf("%d",&Mat.mat[i][j]);
                Mat.mat[i][j] %= mod;
            }
        }
        if (k == 0)
        {
            Mat.show();
            continue;
        }
        Mat = sum(Mat,k);
        Mat.show();
        printf("\n");
    }
    return 0;
}

UVa 11149 Power of Matrix(倍增法、矩阵快速幂)的更多相关文章

  1. Power of Matrix(uva11149+矩阵快速幂)

    Power of Matrix Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit St ...

  2. UVA 11149 - Power of Matrix(矩阵乘法)

    UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...

  3. UVA 11149 Power of Matrix

    矩阵快速幂. 读入A矩阵之后,马上对A矩阵每一个元素%10,否则会WA..... #include<cstdio> #include<cstring> #include< ...

  4. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】

    典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...

  5. hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律

    http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...

  6. HDU - 4965 Fast Matrix Calculation 【矩阵快速幂】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4965 题意 给出两个矩阵 一个A: n * k 一个B: k * n C = A * B M = (A ...

  7. UVA - 10689 Yet another Number Sequence (矩阵快速幂求斐波那契)

    题意:已知f(0) = a,f(1) = b,f(n) = f(n − 1) + f(n − 2), n > 1,求f(n)的后m位数. 分析:n最大为109,矩阵快速幂求解,复杂度log2(1 ...

  8. UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

    题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))( ...

  9. UVA 11149 Power of Matrix 快速幂

    题目链接: http://acm.hust.edu.cn/vjudge/contest/122094#problem/G Power of Matrix Time Limit:3000MSMemory ...

随机推荐

  1. <实训|第六天>偷偷让新手的Linux无限重启附linux主机名称不是随便乱改的!

    先说个事情:这几天我正在忙一个项目的设计,8月1号之前要弄出来,所以每天都要弄到很晚,可能更新就有点跟不上了,不过我如果有时间的话,我就更新,没时间的话,我会在8月1号之后统一更新出来,希望大家谅解! ...

  2. nios II--实验4——按键中断软件部分

    软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...

  3. matlab 画图数据导入

    http://www.yiibai.com/matlab/matlab_data_import.html Python 执行py 文件: 在要执行文件处按shift右击鼠标打开cmd 命令窗口,输入: ...

  4. Linux配置无线网卡驱动实现无线上网

    本机装Linux,需要配置的无线驱动.一般Ubuntu都集成无线驱动,基本上无线可以直接使用! 01.查看无线网卡的型号 [root@Mr-zhao software]# lspci    | gre ...

  5. LVS+Redis部署手册

    Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用 ...

  6. 简单解释CDATA

    在网页源代码中,经常会看见如下代码: <![CDATA[其他内容]]>,其中其他内容一般是脚本. 为什么要用这个标签? 这个标签的意思是Character-Data,即字符数据. 目的,告 ...

  7. js浏览器窗口

    一.clientwidth和clientheight 注:返回了元素大小,但没有单位,默认单位是 px,如果你强行设置了单位,比如 100em之类,它还是会返回 px的大小. (CSS获取的话,是照着 ...

  8. android之二维码扫描的实现

    二维码扫描引擎有 ZBar 和ZXing 一. 使用开源ZXing扫描的缺点 1.原始代码是横屏模式,尽管可以改成竖屏,但是扫描界面的自定义和多屏幕适配不好做 2.有效扫描区域不好控制,可能是我自己技 ...

  9. Kernel Methods - An conclusion

    Kernel Methods理论的几个要点: 隐藏的特征映射函数\(\Phi\) 核函数\(\kappa\): 条件: 对称, 正半定; 合法的每个kernel function都能找到对应的\(\P ...

  10. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...