HDU 1005 Number Sequence

http://acm.hdu.edu.cn/showproblem.php?pid=1005

神奇的矩阵

View Code
#include <iostream>

using namespace std ;

void mul(int a[2][2],int b[2][2])

{

    int c[2][2] ;

    c[0][0]=(a[0][0]*b[0][0]+a[0][1]*b[1][0])%7 ;

    c[0][1]=(a[0][0]*b[0][1]+a[0][1]*b[1][1])%7 ;

    c[1][0]=(a[1][0]*b[0][0]+a[1][1]*b[1][0])%7 ;

    c[1][1]=(a[1][0]*b[0][1]+a[1][1]*b[1][1])%7 ;

    for(int i=0;i<2;i++)

        for(int j=0;j<2;j++)

            a[i][j]=c[i][j] ;

}

void qpow(int m[2][2],int n)

{

    int ans[2][2]={1,0,0,1} ;

    int buff[2][2] ;

    for(int i=0;i<2;i++)

        for(int j=0;j<2;j++)

            buff[i][j]=m[i][j] ;

    while(n)

    {

        if(n&1)

            mul(ans,buff) ;

        mul(buff,buff) ;

        n>>=1 ;

    }

    for(int i=0;i<2;i++)

        for(int j=0;j<2;j++)

            m[i][j]=ans[i][j] ;

}

int main()

{

    int a,b,n ;

    while(scanf("%d%d%d",&a,&b,&n),a)

    {

        if(n<=2)

        {

            puts("1") ;

            continue ;

        }

        int m[2][2] ;

        m[0][0]=a%7,m[0][1]=1,

        m[1][0]=b%7,m[1][1]=0 ;

        qpow(m,n-2) ;

        printf("%d\n",(m[0][0]+m[1][0])%7) ;

    }

    return 0 ;

} 

 

你可能感兴趣的:(sequence)