Cod sursa(job #2879363)

Utilizator NanuGrancea Alexandru Nanu Data 28 martie 2022 15:08:55
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

#define DIM 3
#define MOD 666013

int t, z0, z1, z2, A, B, C, n;
int sol[DIM][DIM], c[DIM][DIM];

static inline void InmultireMatrici(int a[DIM][DIM], int b[DIM][DIM]) {
  int ans[DIM][DIM];
  for(int i = 0; i < DIM; i++)
    for(int j = 0; j < DIM; j++) {
      ans[i][j] = 0;
      for(int k = 0; k < DIM; k++)
        ans[i][j] = (1LL * ans[i][j] +  1LL * a[i][k] * b[k][j]) % MOD;
    }
  
  for(int i = 0; i < DIM; i++)
    for(int j = 0; j < DIM; j++)
      a[i][j] = ans[i][j];;
}

static inline void Putere(int c[DIM][DIM], int n) {
  int ans[DIM][DIM];  //matricea unitate;
  for(int i = 0; i < DIM; i++)
    for(int j = 0; j < DIM; j++)
      if(i == j)
        ans[i][j] = 1;
      else ans[i][j] = 0; 

  while(n) {
    if(n % 2 == 1)
      InmultireMatrici(ans, c);
    n >>= 1;
    InmultireMatrici(c, c);
  }

  for(int i = 0; i < DIM; i++)
    for(int j = 0; j < DIM; j++)
      c[i][j] = ans[i][j];

}

int main() {
  fin >> t;
  while(t--) {
    fin >> z0 >> z1 >> z2;
    fin >> A >> B >> C >> n;


    //matricea calculata;
    c[0][0] = A;
    c[1][0] = B;
    c[2][0] = C;
    c[0][1] = c[1][2] = 1;
    c[0][2] = c[1][1] = c[2][1] = c[2][2] = 0;

    sol[0][0] = z2;
    sol[0][1] = z1;
    sol[0][2] = z0;

    Putere(c, n);
    InmultireMatrici(sol, c);
    fout << sol[0][2] << '\n';
  }

  return 0;
}