hdu 1005 Number Sequence

#include <iostream>


using namespace std;

 

struct Matrix
{
    Matrix(int a,int b,int c,int d):a11(a),a12(b),a21(c),a22(d) {}
    friend Matrix operator*(const Matrix &M1,const Matrix &M2);
    long a11,a12,a21,a22;
};
Matrix operator*(const Matrix &M1,const Matrix &M2)
{//很bj的写法 -||-
    long b11,b12,b21,b22;
    b11=(M1.a11*M2.a11 + M1.a12*M2.a21)%7;
    b12=(M1.a11*M2.a12 + M1.a12*M2.a22)%7;

    b21=(M1.a21*M2.a11 + M1.a22*M2.a21)%7;
    b22=(M1.a21*M2.a12 + M1.a22*M2.a22)%7;

    return Matrix(b11,b12,b21,b22);
}

Matrix solve(Matrix a,int n)
{
    Matrix s(1,0,0,1);

 //二分加速
    while(n)
    {
        if(n&1) s=s*a;
        a=a*a;
        n=n>>1;
    }
    return s;
}

int main()
{
    Matrix s(0,0,0,0);
    long A,B,n;
    while(cin>>A>>B>>n && (A||B||n))
    {
        if(n<=2)
        {
            cout<<1<<endl;
            continue;
        }
        Matrix a(A%7,1,B%7,0);
        s=solve(a,n-2);
        cout<<( (s.a11+s.a21) %7 )<<endl;
    }
    return 0;
}

 

posted @ 2010-08-18 14:50  菜到不得鸟  阅读(287)  评论(0)    收藏  举报