poj3233 Matrix fast power (template)

Question: Given an n*n matrix A, find S = A + A 2 + A 4 + . . + A k (mod m per element)

Problem solution: Matrix fast power:
set S k = I + A + A 2 + A 4 + . . + A k ,in I is the identity matrix

#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;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325750612&siteId=291194637