题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005
#include<cstdio> using namespace std; int n,a,b; struct Matrix { int m[2][2]; void init() { m[0][0] = a; m[0][1] = 1; m[1][0] = b; m[1][1] = 0; } void init0() { m[0][0] = a+b; m[0][1] = 1; m[1][0] = 1; m[1][1] = 1; } void init2() { m[0][0] = 1; m[0][1] = 0; m[1][0] = 0; m[1][1] = 1; } Matrix operator * (Matrix t) { Matrix res; for (int i = 0 ;i < 2; i++) { for (int j = 0 ;j < 2 ;j++) { res.m[i][j] = 0; for (int k = 0 ;k < 2 ;k++) res.m[i][j] += (m[i][k] * t.m[k][j]); res.m[i][j] %= 7; } } return res; } }; Matrix quickpow(Matrix s,int k) { Matrix res; res.init2(); while(k) { if(k & 1) res = res * s; k >>= 1; s = s * s; } return res; } int main() { while(scanf("%d %d %d",&a,&b,&n) && (a || b || n)) { if(n == 1|| n == 2) { printf("1 "); continue; } Matrix ans; ans.init0(); Matrix t; t.init(); ans = ans * quickpow(t ,n-2); printf("%d ",ans.m[0][1] % 7); } return 0; }