题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126
存在参数a,b为负数的情况。这时候要这么处理:
根据mod值(7)加至刚好大于0。
否则有些样例是过不去的。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 10; 23 typedef struct Matrix { 24 int m[maxn][maxn]; 25 int r; 26 int c; 27 Matrix(){ 28 r = c = 0; 29 memset(m, 0, sizeof(m)); 30 } 31 } Matrix; 32 33 Matrix mul(Matrix m1, Matrix m2, int mod) { 34 Matrix ans = Matrix(); 35 ans.r = m1.r; 36 ans.c = m2.c; 37 for(int i = 1; i <= m1.r; i++) { 38 for(int j = 1; j <= m2.r; j++) { 39 for(int k = 1; k <= m2.c; k++) { 40 if(m2.m[j][k] == 0) continue; 41 ans.m[i][k] = ((ans.m[i][k] + m1.m[i][j] * m2.m[j][k] % mod) % mod) % mod; 42 } 43 } 44 } 45 return ans; 46 } 47 48 Matrix quickmul(Matrix m, int n, int mod) { 49 Matrix ans = Matrix(); 50 for(int i = 1; i <= m.r; i++) { 51 ans.m[i][i] = 1; 52 } 53 ans.r = m.r; 54 ans.c = m.c; 55 while(n) { 56 if(n & 1) { 57 ans = mul(m, ans, mod); 58 } 59 m = mul(m, m, mod); 60 n >>= 1; 61 } 62 return ans; 63 } 64 65 int a, b, n, m; 66 67 int main() { 68 // freopen("in", "r", stdin); 69 m = 7; 70 while(~scanf("%d %d %d", &a, &b, &n)) { 71 Matrix p; 72 while(a < 0) a += m; 73 while(b < 0) b += m; 74 p.r = 2, p.c = 1; 75 p.m[1][1] = 1; 76 p.m[2][1] = 1; 77 if(n <= 4) { 78 printf("%d ", p.m[4-n+1][1] % m); 79 continue; 80 } 81 Matrix s; 82 s.r = s.c = 2; 83 s.m[1][1] = a, s.m[1][2] = b; 84 s.m[2][1] = 1, s.m[2][2] = 0; 85 s = quickmul(s, n-2, m); 86 int ans = 0; 87 for(int i = 1; i <= p.r; i++) { 88 ans = (ans + (p.m[i][1] * s.m[1][i]) % m) % m; 89 } 90 printf("%d ", ans % m); 91 } 92 return 0; 93 }