码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵快速幂

时间:2015-06-19 01:16:10      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

矩阵乘法是一种高效的算法可以把一些一维递推优化到log( n ),还可以求路径方案等,所以更是是一种应用性极强的算法。矩阵,是线性代数中的基本概念之一。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。矩阵乘法看起来很奇怪,但实际上非常有用,应用也十分广泛。

基本定义 

  它是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×n的矩阵am,n)左乘一个n×p的矩阵bn,p),会得到一个m×p的矩阵cm,p),满足

  矩阵乘法满足结合率,但不满足交换率

  一般的矩乘要结合快速幂才有效果``

 http://poj.org/problem?id=3070

技术分享
#include<cstdio>
#include<iostream>

using namespace std;
const int MOD = 10000;

struct matrix{
    int m[2][2];
}ans, base;

matrix mul(matrix a, matrix b)
{
    matrix tmp;
    for(int i=0; i<2; ++i)
    {
        for(int j=0; j<2; ++j)
        {
            tmp.m[i][j] = 0;
            for(int k=0; k<2; ++k)
            tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
        }
    }
    return tmp;
}

int fast_mod(int n)
{
    base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
    base.m[1][1] = 0;
    ans.m[0][0] = ans.m[1][1] = 1;
    ans.m[0][1] = ans.m[1][0] = 0;
    while(n)
    {
        if(n&1)
        {
            ans = mul(ans, base);
        }
        base = mul(base, base);
        n >>= 1;
    }
    return ans.m[0][1];
}

int main()
{
    int n;
    while(scanf("%d", &n)&&n!=-1)
    {
        printf("%d\n", fast_mod(n));
    }
    return 0;
}
View Code

稍加优化:

技术分享
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
const int MOD = 10000;

struct matrix{
    int m[2][2];
}ans, base;

matrix mul(matrix a, matrix b)
{
    matrix tmp;
    memset(tmp.m, 0, sizeof(tmp.m));
    for(int i=0; i<2; i++)
    for(int k=0; k<2; k++)
    if(a.m[i][k])
    for(int j=0; j<2; j++)
    tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
    return tmp;
}

int fast_mod(int n)
{
    base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
    base.m[1][1] = 0;
    ans.m[0][0] = ans.m[1][1] = 1;
    ans.m[0][1] = ans.m[1][0] = 0;
    while(n)
    {
        if(n&1)
        {
            ans = mul(ans, base);
        }
        base = mul(base, base);
        n >>= 1;
    }
    return ans.m[0][1];
}

int main()
{
    int n;
    while(scanf("%d", &n)&&n!=-1)
    {
        printf("%d\n", fast_mod(n));
    }
    return 0;
}
View Code

 

矩阵快速幂

标签:

原文地址:http://www.cnblogs.com/acm1314/p/4587326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!