Cod sursa(job #2676627)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 24 noiembrie 2020 18:17:45
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <cstring>

using namespace std;

const int MODULO = 666013;

int matConst[3][3];
int matPut[3][3];

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

//                   NxM          MxK          NxK
void inmultire(int a[3][3], int b[3][3], int c[3][3])
{
  for (int k = 0; k < 3; k++)
  {
    for (int i = 0; i < 3; i++)
    {
      for (int j = 0; j < 3; j++)
      {
        c[i][j] = (c[i][j] +  (long long)a[i][k] * b[k][j]) % MODULO ;
      }
    }
  }
}

void ridicareLog(int n)
{
  int base[3][3];
  int aux[3][3];

  memcpy(base, matConst, sizeof(base));

  memset(matPut, 0, sizeof(matPut));
  matPut[0][0] = 1;
  matPut[1][1] = 1;
  matPut[2][2] = 1;

  while (n > 0)
  {
    if (n & 1)
    {
      memset(aux, 0, sizeof(aux));
      inmultire(matPut, base, aux);
      memcpy(matPut, aux, sizeof(matPut));
    }

    memset(aux, 0, sizeof(aux));
    inmultire(base, base, aux);
    memcpy(base, aux, sizeof(base));

    n = n / 2;
  }
}


int main()
{
  int t;
  int x, y, z, a, b, c, n;

  in >> t;
  for (int i = 1; i <= t; i++)
  {
    in >> x >> y >> z >> a >> b >> c >> n;

    memset(matConst, 0, sizeof(matConst));
    matConst[1][0] = 1;
    matConst[2][1] = 1;
    matConst[0][2] = c;
    matConst[1][2] = b;
    matConst[2][2] = a;
/*
    matConst = {
      {0, 0, c},
      {1, 0, b},
      {0, 1, a}
    };
*/

    ridicareLog(n - 2);

    out << ((long long)x * matPut[0][2] + (long long)y * matPut[1][2] + (long long)z * matPut[2][2]) % MODULO << '\n';
  }

  return 0;
}