Cod sursa(job #2850626)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 17 februarie 2022 09:55:34
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#define NMAX 3
#define MOD 666013
#define int long long
using namespace std;

int sol[NMAX + 1][NMAX + 1];
int aux[NMAX + 1][NMAX + 1];

void inmultire (int a[NMAX + 1][NMAX + 1], int b[NMAX + 1][NMAX + 1]){

  int mat[NMAX + 1][NMAX + 1];

  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++){
      mat[i][j] = 0;
      for (int t = 0; t < 3; t++)
        mat[i][j] = (mat[i][j] + (1LL * a[i][t] * b[t][j])% MOD) % MOD;
    }
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
      a[i][j] = mat[i][j];
}

signed main(){

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

  int q;
  fin >> q;

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

    for (int i = 0; i < 3; i++) //prereset la mat
      for (int j = 0; j < 3; j++)
        aux[i][j] = sol[i][j] = 0;

    aux[0][2] = c, aux[1][0] = 1, aux[1][2] = b, aux[2][1] = 1, aux[2][2] = a;
    sol[0][0] = sol[1][1] = sol[2][2] = 1;

    zi -= 2;
    while (zi > 0){
      if (zi % 2 == 1)
        inmultire(sol, aux);
      inmultire(aux, aux);
      zi /= 2;
    }
    x = (x * sol[0][2] * 1LL) % MOD;
    y = (y * sol[1][2] * 1LL) % MOD;
    z = (z * sol[2][2] * 1LL) % MOD;
    fout << (x + y + z) % MOD << "\n";
  }

  return 0;
}