本体有2种方法,一种是矩阵快速幂,一种是找规律。我用的是矩阵快速幂。
f(1)=1; f(2)=1; f(n)=( A*(f(n-1)) + B*(f(n-2)) )mod7;
[ f(n) ] = [ A B ] * [ f(n-1) ] => [ f(n) ] = [ A B ] (n-2) * [ f(1) ]
[ f(n-1) ] [ 1 0 ] [ f(n-2) ] => [ f(n-1) ] [ 1 0 ] [ f(2) ]
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 struct matrix{ 7 int a[2][2]; 8 }res,temp; 9 matrix mul(matrix a,matrix b){10 matrix t;11 memset(t.a,0,sizeof(t.a));12 int i,j,k;13 for(i=0;i<2;++i)14 for(j=0;j<2;++j)15 for(k=0;k<2;++k){16 t.a[i][j]+=a.a[i][k]*b.a[k][j];17 t.a[i][j]%=7;18 }19 return t;20 }21 int main(){22 int A,B,n,i,j;23 while(~scanf("%d%d%d",&A,&B,&n)){24 if(A==0&&B==0&&n==0) break;25 if(n<=2) {printf("1\n");continue;}26 27 memset(res.a,0,sizeof(res.a));28 res.a[0][0]=res.a[1][1]=1;29 temp.a[0][0]=A;30 temp.a[0][1]=B;31 temp.a[1][0]=1;32 temp.a[1][1]=0;33 n=n-2;34 while(n){35 if(n&1)36 res=mul(res,temp);37 n>>=1;38 temp=mul(temp,temp);39 }40 printf("%d\n",(res.a[0][0]+res.a[0][1])%7 );41 }42 43 return 0;44 45 }
posted on 2013-09-03 11:22 阅读( ...) 评论( ...)