现在的位置: 首页 > 综合 > 正文

poj 3233 Matrix Power Series(矩阵乘法)

2014年08月29日 ⁄ 综合 ⁄ 共 1479字 ⁄ 字号 评论关闭

题意:给出矩阵A,求A+A^2+A^3+……+A^k。

思路:快速幂可以算出A^k。然后看和的长度,如果为偶数,那么结果为A^(k/2)*A(k/2),否则为A^(k-1)+A^k。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=31;
struct Matrix
{
    int mat[maxn][maxn],n;
    Matrix(){};
    Matrix(int nn) {n=nn;}
    void Init()
    {
        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                mat[i][j]=(i==j);
    }
    void clear(){memset(mat,0,sizeof(mat));}
};
int n,m,k;
Matrix operator *(const Matrix &a ,const Matrix & b)
{
    Matrix c(a.n);c.clear();
    for(int k=0;k<c.n;++k)
        for(int i=0;i<c.n;++i)
            for(int j=0;j<c.n;++j)
                c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%m;
    return c;
}
Matrix operator +(const Matrix &a,const Matrix & b)
{
    Matrix c(a.n);
    for(int i=0;i<c.n;++i)
        for(int j=0;j<c.n;++j)
            c.mat[i][j]=(a.mat[i][j]+b.mat[i][j])%m;
    return c;
}
Matrix p(const Matrix & a,int N)
{
    Matrix x=(n),y=a;
    x.Init();
    while(N)
    {
        if(N&1) x=x*y;
        y=y*y;
        N>>=1;
    }
    return x;
}
Matrix f(const Matrix &a,int N)
{
    Matrix c(a.n);
    c.Init();
    if(N==0) return c;
    if(N==1) return c=a;
    if(N&1) return f(a,N-1)+p(a,N);
    return f(a,N/2)*(p(a,N/2)+c);
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d%d%d",&n,&k,&m);
    Matrix a(n);
    for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
        {
            scanf("%d",&a.mat[i][j]);
            a.mat[i][j]%=m;
        }
    Matrix ans=f(a,k);
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            if(j) printf(" ");
            printf("%d",ans.mat[i][j]%m);
        }
        printf("\n");
    }
    return 0;
}



抱歉!评论已关闭.