http://acm.hdu.edu.cn/showproblem.php?pid=1005
神奇的矩阵
View Code
#include <iostream> using namespace std ; void mul(int a[2][2],int b[2][2]) { int c[2][2] ; c[0][0]=(a[0][0]*b[0][0]+a[0][1]*b[1][0])%7 ; c[0][1]=(a[0][0]*b[0][1]+a[0][1]*b[1][1])%7 ; c[1][0]=(a[1][0]*b[0][0]+a[1][1]*b[1][0])%7 ; c[1][1]=(a[1][0]*b[0][1]+a[1][1]*b[1][1])%7 ; for(int i=0;i<2;i++) for(int j=0;j<2;j++) a[i][j]=c[i][j] ; } void qpow(int m[2][2],int n) { int ans[2][2]={1,0,0,1} ; int buff[2][2] ; for(int i=0;i<2;i++) for(int j=0;j<2;j++) buff[i][j]=m[i][j] ; while(n) { if(n&1) mul(ans,buff) ; mul(buff,buff) ; n>>=1 ; } for(int i=0;i<2;i++) for(int j=0;j<2;j++) m[i][j]=ans[i][j] ; } int main() { int a,b,n ; while(scanf("%d%d%d",&a,&b,&n),a) { if(n<=2) { puts("1") ; continue ; } int m[2][2] ; m[0][0]=a%7,m[0][1]=1, m[1][0]=b%7,m[1][1]=0 ; qpow(m,n-2) ; printf("%d\n",(m[0][0]+m[1][0])%7) ; } return 0 ; }