hust 1384 The value of F[n]

http://acm.hust.edu.cn/thx/problem.php?id=1384

 

#include <stdio.h>

 

#define MOD 9901
#define N 3

 

struct Matrix
{
    Matrix();
    Matrix(int arr[N][N]);
    int row,col,a[N][N];
};
Matrix::Matrix()
{
    row=col=N;
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
            if(i==j) a[i][j]=1;
            else a[i][j]=0;
}
Matrix::Matrix(int arr[N][N])
{
    row=col=N;
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            a[i][j]=arr[i][j];
        }
    }
}
Matrix operator*(const Matrix &M1,const Matrix &M2)
{
    Matrix M3;
    for(int i=0;i<M1.row;i++)
    {
        for(int j=0;j<M2.col;j++)
        {
            M3.a[i][j]=0;
            for(int k=0;k<M1.col;k++)
            {
                M3.a[i][j]=( M3.a[i][j]+M1.a[i][k]*M2.a[k][j] ) % MOD;
            }
        }
    }
    return M3;
}

Matrix solve(Matrix a,long n)
{
    Matrix s;
    while(n)
    {
        if(n&1) s=s*a;
        a=a*a;
        n>>=1;
    }
    return s;
}

int main()
{
    int Q,arr[N][N]={{1,1,0},{2,0,1},{3,0,0}};
    Matrix a(arr),s;
    scanf("%d",&Q);
    while(Q--)
    {
        int f0,f1,f2;
        long n;
        scanf("%d %d %d %ld",&f0,&f1,&f2,&n);
        f0=f0%MOD;
        f1=f1%MOD;
        f2=f2%MOD;
        s=solve(a,n-2);
        printf("%d\n",(f2*s.a[0][0]+f1*s.a[1][0]+f0*s.a[2][0]) % MOD);
    }
    return 0;
}

 

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