Cod sursa(job #1851537)

Utilizator tudorcomanTudor Coman tudorcoman Data 19 ianuarie 2017 21:09:11
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb

#include <cstdio>
#include <cstring>

const int mod = 666013;

void elementul_neutru(int a[3][3]){
  memset(a, 0, sizeof a);
  for(int i = 0; i < 3; ++ i)
    a[i][i] = 1;
}

class Matrix {
public:
  int m[3][3];
  Matrix() {
    memset(m, 0, sizeof m);
  }

  Matrix(const int k[3][3]) {
    for(int i = 0; i < 3; ++ i)
      for(int j = 0; j < 3; ++ j)
        m[i][j] = k[i][j];
  }

  Matrix operator * (const Matrix& other) const {
    Matrix ans;
    for(int i = 0; i <= 2; ++ i)
      for(int j = 0; j <= 2; ++ j)
        for(int k = 0; k <= 2; ++ k)
          ans.m[i][j] = (ans.m[i][j] % mod + (1LL * m[i][k] * other.m[k][j]) % mod) % mod;
    return ans;
  }

  inline void operator = (const Matrix& other) {
    for(int i = 0; i < 3; ++ i)
      for(int j = 0; j < 3; ++ j)
        m[i][j] = other.m[i][j];
  }

  Matrix operator ^ (int e) const {
    Matrix ans, aux;
    aux = *this;
    elementul_neutru(ans.m);
    while(e) {
      if(e & 1)
        ans = ans * aux;
      aux = aux * aux;
      e >>= 1;
    }

    return ans;
  }
};

int main() {
  freopen("iepuri.in", "r", stdin);
  freopen("iepuri.out", "w", stdout);

  int T;
  for(scanf("%d", &T); T; -- T) {
    int x, y, z, A, b, c, N;
    scanf("%d %d %d %d %d %d %d", &x, &y, &z, &A, &b, &c, &N);
    int a[3][3];
    a[0][0] = A; a[1][0] = b; a[2][0] = c;
    a[0][1] = 1; a[1][1] = 0; a[2][1] = 0;
    a[0][2] = 0; a[1][2] = 1; a[2][2] = 0;
    Matrix m = Matrix(a)^(N - 2);
    int ans = (((1LL * z * m.m[0][0]) % mod) + ((1LL * y * m.m[1][0]) % mod) + ((1LL * x * m.m[2][0]) % mod)) % mod;
    printf("%d\n", ans);
  }
  return 0;
}