Cod sursa(job #2773777)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 8 septembrie 2021 17:19:18
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

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

using ll = long long;

const int mod = 666013;

int t, n, a, b, c, x, y, z;

class Matrix {
private:
  int m[3][3];
public:
  Matrix(int val) {
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        m[i][j] = val;
      }
    }
  }
  Matrix(int a, int b, int c, int d, int e, int f, int g, int h, int i) {
    m[0][0] = a;
    m[0][1] = b;
    m[0][2] = c;
    m[1][0] = d;
    m[1][1] = e;
    m[1][2] = f;
    m[2][0] = g;
    m[2][1] = h;
    m[2][2] = i;
  }
  Matrix operator* (const Matrix& snd) {
    Matrix ans(0);
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 3; k++) {
          ans.m[i][j] = (ll)(ans.m[i][j] + ((ll)m[i][k] * (ll)(snd.m[k][j])) % mod) % mod;
        }
      }
    }
    return ans;
  }
  int getResult() {
    return m[0][2];
  }
};

int main() {
  in >> t;
  for (int tt = 1; tt <= t; tt++) {
    in >> x >> y >> z >> a >> b >> c >> n;
    n -= 2;
    Matrix ans(1, 0, 0, 0, 1, 0, 0, 0, 1);
    Matrix m(0, 0, c, 1, 0, b, 0, 1, a);
    while (n > 0) {
      if (n % 2 > 0) {
        ans = ans * m;
      }
      m = m * m;
      n /= 2;
    }
    Matrix t(x, y, z, 0, 0, 0, 0, 0, 0);
    ans = t * ans;
    out << ans.getResult() << "\n";
  }
  return 0;
}