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