hdu 1757 A Simple Math Problem

#include <stdio.h>
#include <string.h>

 

#define MAXN 10

int MOD,mat[MAXN][MAXN];

struct Matrix
{
    Matrix();
    Matrix(int arr[MAXN][MAXN]);
    friend Matrix operator*(const Matrix &,const Matrix &);
    int r,c,a[MAXN][MAXN];
};
Matrix::Matrix()
{
    r=c=MAXN;
    for(int i=0; i<r; i++)
        for(int j=0; j<c; j++)
            if(i==j) a[i][j]=1;
            else a[i][j]=0;
}
Matrix::Matrix(int arr[MAXN][MAXN])
{
    r=c=MAXN;
    for(int i=0; i<r; i++)
        for(int j=0; j<c; j++)
            a[i][j]=arr[i][j];
}
Matrix operator*(const Matrix &m1,const Matrix &m2)
{
    Matrix m3;
    int i,j,k;
    for(i=0; i<m1.r; i++)
    {
        for(j=0; j<m2.c; j++)
        {
            m3.a[i][j]=0;
            for(k=0; k<m1.c; k++)
            {
                m3.a[i][j] = (m3.a[i][j]+m1.a[i][k]*m2.a[k][j]) % MOD;
            }
        }
    }
    return m3;
}

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

int main()
{
    int i,n,t;
    for(i=0; i<=8; i++) mat[i][i+1]=1;
    freopen("testdata.txt","r",stdin);
    while(scanf("%d %d",&n,&MOD)!=EOF)
    {
        for(i=0; i<10; i++)
        {
            scanf("%d",&t);
            mat[i][0]=t%MOD;
        }
        if(n<10)
        {
            printf("%d\n",n%MOD);
            continue;
        }
        Matrix a(mat);
        Matrix s=solve(a,n-9);
        int ans=0;
        for(i=0; i<10; i++)
        {
            ans = (ans+(9-i)*s.a[i][0]) % MOD;
        }
        printf("%d\n",ans);
    }
    return 0;
}

posted @ 2010-08-30 23:18  菜到不得鸟  阅读(267)  评论(0)    收藏  举报