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;
}
浙公网安备 33010602011771号