/* 矩阵乘法的题目 F[n] = 2 * F[n - 1] + 2 ^ (n - 3) - F[n - 3] */ #include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; int MOD = 10007; struct Matrix { int map[4][4]; Matrix () { for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) { map[i][j] = 0; } } }; inline Matrix mul(Matrix a, Matrix b) { int i, j, k; Matrix ans; for (i = 0; i < 4; ++i) for (k = 0; k < 4; ++k) if(a.map[i][k]) for(j = 0; j < 4; j++) if(b.map[k][j]) { ans.map[i][j] = (ans.map[i][j] + a.map[i][k] * b.map[k][j]) % MOD; if (ans.map[i][j] < 0) { ans.map[i][j] = ans.map[i][j] + MOD; } } return ans; } Matrix fun(Matrix a, Matrix b, int n) { while(n){ if(n & 1){ n--; a = mul(a, b); } else{ n >>= 1; b = mul(b, b); } } return a; } int main() { int n; Matrix a, b; while (scanf("%d", &n) != EOF) { if (n < 3) { puts("0"); continue; } a.map[0][0] = 2; a.map[0][1] = 0; a.map[0][2] = 1; a.map[0][3] = 0; b.map[0][0] = 2; b.map[2][0] = 2; b.map[3][0] = -1; b.map[1][3] = 1; b.map[0][1] = 1; b.map[2][2] = 2; Matrix ans = fun(a, b, n - 3); printf("%d/n", ans.map[0][0]); } return 0; }