Cod sursa(job #3140005)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 3 iulie 2023 13:55:26
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

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

#define int long long
const int MOD=666013;
int mod(int n) {
  return (n%MOD+MOD)%MOD;
}

using mat = array<array<int,3>,3>;

void display(mat m) {
  for (int i=0; i<3; ++i) {
    for (int j=0; j<3; ++j) cout<<m[i][j]<<" ";
    cout<<endl;
  }
  cout<<endl;
}

mat mult(mat a, mat b) {
  mat c{};
  for (int i=0; i<3; ++i) {
    for (int j=0; j<3; ++j) {
      for (int k=0; k<3; ++k) c[i][k] = mod(c[i][k] + a[i][j] * b[j][k]%MOD);
    }
  }
  return c;
}

void binpow(mat& res, mat& m, int n) {
  while (n) {
    if (n&1) res = mult(res, m);
    m = mult(m, m);
    n >>= 1;
  }
}

signed main() {
  int t;
  fin>>t;

  while (t--) {
    int x, y, z, a, b, c, n;
    fin>>x>>y>>z>>a>>b>>c>>n;

    assert(n >= 3);

    mat m{};
    m[0][2] = c;
    m[1][2] = b;
    m[2][2] = a;
    m[1][0] = 1;
    m[2][1] = 1;

    mat res{};
    res[0][0] = x;
    res[1][1] = y;
    res[2][2] = z;

    binpow(res, m, n-2);

    fout<<mod(res[0][2] + res[1][2] + res[2][2])<<endl;
  }
}