Cod sursa(job #2328847)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 26 ianuarie 2019 11:06:13
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>

using namespace std;

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

const int MOD = 666013;

int nr_task;
int N;
int X, Y, Z, A, B, C;

int mat[4][4], aux[4][4], init[4][4];

void Quick_exp( int pow );

void Read()
{
  fin >> nr_task;

  for( int i = 1; i <= nr_task; ++i )
  {
    fin>>X>>Y>>Z>>A>>B>>C>>N;

    init[1][1] = 0; init[1][2] = 0; init[1][3] = C;
    init[2][1] = 1; init[2][2] = 0; init[2][3] = B;
    init[3][1] = 0; init[3][2] = 1; init[3][3] = A;

    for( int i = 1; i <= 3; ++i )
      for( int j = 1; j <= 3; ++j )
       mat[i][j] = init[i][j];

    Quick_exp( N - 2 );

    fout << ( ( 1LL * X * mat[1][3] ) % MOD + ( 1LL * Y * mat[2][3] ) % MOD + ( 1LL * Z * mat[3][3] ) % MOD ) << '\n';
  }

}

void Quick_exp( int pow )
{
  if( pow <= 1 ) return;

  Quick_exp( pow / 2 );

  for( int i = 1; i <= 3; ++i )
    for( int j = 1; j <= 3; ++j )
    {
      aux[i][j] = 0;
      for( int J = 1, I = 1; J <= 3; ++J, ++I )
        aux[i][j] += ( 1LL *  mat[i][J] * mat[I][j] ) % MOD;

      aux[i][j] %= MOD;
    }

  if( pow % 2 )
  {
    for( int i = 1; i <= 3; ++i )
     for( int j = 1; j <= 3; ++j )
      mat[i][j] = aux[i][j];

    for( int i = 1; i <= 3; ++i )
     for( int j = 1; j <= 3; ++j )
     {
       aux[i][j] = 0;
       for( int J = 1, I = 1; J <= 3; ++J, ++I )
         aux[i][j] += ( 1LL *  mat[i][J] * init[I][j] ) % MOD;

       aux[i][j] %= MOD;
     }
  }

  for( int i = 1; i <= 3; ++i )
   for( int j = 1; j <= 3; ++j )
     mat[i][j] = aux[i][j];
}

int main()
{
  Read();

    return 0;
}