POJ 3233 Matrix Power Series --二分求矩阵等比数列和

矩阵快速幂求和
本文介绍了一种使用矩阵快速幂来高效计算形如 S(k)=A+A^2+...+A^k 的方法。通过递归分解和二分思想,能够显著减少计算量。文章提供了详细的C++实现代码。

题意:求S(k) = A+A^2+...+A^k.

解法:二分即可。

if(k为奇)  S(k) = S(k-1)+A^k

else        S(k) = S(k/2)*(I+A^(k/2))

代码:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#define SMod m
using namespace std;

int n,m,k;

struct Matrix
{
    int m[32][32];
    Matrix()
    {
        memset(m,0,sizeof(m));
        for(int i=1;i<=n;i++)
            m[i][i] = 1;
    }
};

Matrix Mul(Matrix a,Matrix b)
{
    Matrix res;
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            res.m[i][j] = 0;
            for(k=1;k<=n;k++)
                res.m[i][j] = (res.m[i][j]+(a.m[i][k]*b.m[k][j])%SMod + SMod)%SMod;
        }
    }
    return res;
}

Matrix add(Matrix a,Matrix b)
{
    Matrix res;
    memset(res.m,0,sizeof(res.m));
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            res.m[i][j] = (a.m[i][j]+b.m[i][j])%SMod;
    return res;
}

Matrix fastm(Matrix a,int b)
{
    Matrix res;
    while(b)
    {
        if(b&1LL)
            res = Mul(res,a);
        a = Mul(a,a);
        b >>= 1;
    }
    return res;
}

Matrix getsum(Matrix a,int b)
{
    Matrix A = a;
    Matrix I;
    if(b == 1)
        return A;
    if(b & 1)
        return add(getsum(a,b-1),fastm(a,b));
    else
        return Mul(getsum(a,b/2),add(I,fastm(a,b/2)));
}

int main()
{
    int i,j;
    while(scanf("%d%d%d",&n,&k,&m)!=EOF)
    {
        Matrix ans;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&ans.m[i][j]);
        ans = getsum(ans,k);
        for(i=1;i<=n;i++)
        {
            printf("%d",ans.m[i][1]%m);
            for(j=2;j<=n;j++)
                printf(" %d",ans.m[i][j]%m);
            puts("");
        }
    }
    return 0;
}
View Code

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值