poj3233矩阵快速幂(模板)

题意:给定一个n*n的矩阵A,求 S = A + A 2 + A 4 + . . + A k (每个元素mod m)

题解:矩阵快速幂:
S k = I + A + A 2 + A 4 + . . + A k ,其中 I 为单位矩阵

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,m;
struct mat
{
    int a[100][100];
};

mat operator*(const mat &a,const mat &b)
{
    mat ans;
    for(int i=0; i<2*n; i++)
    {
        for(int j=0; j<2*n; j++)
        {
            ans.a[i][j]=0;
            for(int k=0; k<2*n; k++)
            {
                ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%m;
            }
        }
    }
    return ans;
}
mat base;
mat qm(int t)
{
    mat ans;
    memset(ans.a,0,sizeof ans.a);
    for(int i=0; i<2*n; i++)
        ans.a[i][i]=1;
    while(t)
    {
        if(t&1)
            ans=ans*base;
        t>>=1;
        base=base*base;
    }
    return ans;

}
int main()
{
    while(scanf("%d%d%d",&n,&k,&m)!=EOF)
    {
        memset(base.a,0,sizeof base.a);
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                scanf("%d",&base.a[i][j]);
            }
        }
        for(int i=0; i<n; i++)
        {
            base.a[i+n][i]=1;
            base.a[i+n][i+n]=1;
        }

        mat ans=qm(k+1);

        for(int i=n; i<2*n; i++)
        {
            if(i==n)
                printf("%d",(ans.a[i][0]+m-1)%m);
            else
                printf("%d",ans.a[i][0]);
            for(int j=1; j<n; j++)
            {
                if(i==(j+n))
                    printf(" %d",(ans.a[i][j]+m-1)%m);
                else
                    printf(" %d",ans.a[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35160381/article/details/80220412
今日推荐