Cod sursa(job #1466487)

Utilizator vladrochianVlad Rochian vladrochian Data 29 iulie 2015 12:12:49
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <cstring>
using namespace std;

const int kMod = 666013;

ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

class Matrix {
 public:
  Matrix() {
    memset(a, 0, sizeof a);
  }
  Matrix(int a00, int a01, int a02, int a10, int a11, int a12, int a20, int a21, int a22) {
    a[0][0] = a00; a[0][1] = a01; a[0][2] = a02;
    a[1][0] = a10; a[1][1] = a11; a[1][2] = a12;
    a[2][0] = a20; a[2][1] = a21; a[2][2] = a22;
  }
  Matrix operator*(const Matrix &other) {
    Matrix ans;
    for (int i = 0; i < 3; ++i)
      for (int j = 0; j < 3; ++j)
        for (int k = 0; k < 3; ++k)
          ans.a[i][j] = (ans.a[i][j] + ((int64_t)a[i][k] * other.a[k][j])) % kMod;
    return ans;
  }
  int a[3][3];
};

void MultPow(Matrix &m, Matrix &base, int p) {
  while (p) {
    if (p & 1)
      m = m * base;
    base = base * base;
    p >>= 1;
  }
}

int main() {
  int T;
  fin >> T;
  while (T--) {
    int x, y, z, a, b, c, n;
    fin >> x >> y >> z >> a >> b >> c >> n;
    Matrix m(x, y, z,
             0, 0, 0,
             0, 0, 0),
           base(0, 0, c,
                1, 0, b,
                0, 1, a);
    MultPow(m, base, n - 2);
    fout << m.a[0][2] << "\n";
  }
  return 0;
}