#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 10;
const int mod = 200907;
int cnt;
struct Matrix {
int v[maxn][maxn];
Matrix() {}
Matrix(int x) {
init();
for (int i = 0; i < maxn; i++)
v[i][i] = x;
}
void init() {
memset(v, 0, sizeof(v));
}
Matrix operator *(Matrix const &b) const {
Matrix c;
c.init();
for (int i = 0; i < cnt; i++)
for (int j = 0; j < cnt; j++)
for (int k = 0; k < cnt; k++)
c.v[i][j] = (c.v[i][j] + (ll)v[i][k]*b.v[k][j]) % mod;
return c;
}
Matrix operator ^(int b) {
Matrix a = *this, res(1);
while (b) {
if (b & 1)
res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
} a, b, tmp;
int main() {
int n;
while (scanf("%d", &n) != EOF && n != 0) {
if (n < 3) {
printf("%d\n", n);
continue;
}
a.init();
cnt = 3;
a.v[0][0] = a.v[0][2] = a.v[1][0] = a.v[2][2] = 1;
a.v[0][1] = 2;
tmp = a^(n-2);
printf("%d\n", (tmp.v[0][0]*2 + tmp.v[0][1] + tmp.v[0][2]) % mod);
}
return 0;
}
tjut 2842
最新推荐文章于 2016-11-04 22:02:44 发布