Number Sequence hdu 构造矩阵乘法
/*题目所给的a,b和f的初始值很重要。一次来确定矩阵的元素和幂。[a b1 0]×[f(n?1)f(n?2)]=[f(n)f(n?1)][a b1 0]n?2×[11]=[f(n)f(n?1)]因为f[1]=1,f[2]=1,所以递推到n-2次幂,间接矩阵为1,1.如果初始条件改变的话,次幂也间接矩阵也会随之改变。要灵活应用。*/#include <stdio.h>#include <cstring>const int mod=7;int A[3][3],ans[3][3];void mul(int a[][3],int b[][3]){ int tmp[3][3]; for(int i=1; i<=2; i++) for(int j=1; j<=2; j++) { tmp[i][j]=0; for(int k=1; k<=2; k++) { tmp[i][j]+=a[i][k]*b[k][j]; } if(tmp[i][j]>=mod) tmp[i][j]%=mod; } memcpy(a,tmp,sizeof(tmp));}void pow(int a[][3],int b[][3],int n){ int tmp[3][3]; memcpy(tmp,b,sizeof(int)*9); a[1][1]=a[2][2]=1; a[1][2]=a[2][1]=0; while(n) { if(n&1) mul(a,tmp); mul(tmp,tmp); n>>=1; }}int main(){ int n,a,b; while(scanf("%d%d%d",&a,&b,&n)==3) { if(a==0&&b==0&&n==0) break; if(n<=2) printf("1\n"); else { memset(ans,0,sizeof(ans)); A[1][1]=a; A[1][2]=b; A[2][1]=1; A[2][2]=0; pow(ans,A,n-2); printf("%d\n",(ans[1][2]+ans[1][1])%7); } } return 0;}