tjut 2842

来源:互联网 发布:日本软件行业 编辑:程序博客网 时间:2024/06/05 13:07
#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;  }  

0 0