Topic 1412: Powers of matrices_Fast powers of matrices

 

//
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

class matrix
{
    public:
        int a[2][2];
        matrix() { memset( a,0,sizeof( a ) ); }

        void init() { memset( a,0,sizeof( a ) ); }
        void one()
        {
            for( int i=0;i<2;i++ )
                for( int j=0;j<2;j++ )
                    if( i==j ) a[i][j]=1;
        }
};

matrix mul( matrix& x,matrix& y )
{
    matrix ans;
    int i,j,k;

    for( i=0;i<2;i++ )
        for( j=0;j<2;j++ )
            for( k=0;k<2;k++ )
                ans.a[i][j]+=x.a[i][k]*y.a[k][j];
    return ans;
}

matrix fastpow( matrix in,int n )
{
    matrix ans; ans.one();
    while( n )
    {
        if( n&1 ) ans=mul( ans,in );
        in=mul( in,in );
        n>>=1;
    }
    return ans;
}

int main()
{
    int n,i,j,cnt=0;
    matrix in,ans;

    for( i=0;i<2;i++ )
        for( j=0;j<2;j++ )
            in.a[i][j]=cnt++;

    while( cin>>n )
    {
        ans=fastpow( in,n );
        for( i=0;i<2;i++ )
            for( j=0;j<2;j++ )
            {
                if( i||j ) cout<<" ";
                cout<<ans.a[i][j];        // ans
            }
        cout<<endl;
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_63173957/article/details/123897342