Cod sursa(job #2326884)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 24 ianuarie 2019 10:36:15
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>

using namespace std;

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

const int MOD = 666013;

int nr_tasks;
int x, y, z, A, B, C;
int N;

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

void Do();

void Read()
{
  fin >> nr_tasks;

  for( int i = 1; i <= nr_tasks; ++i )
  {
   fin >> x >> y >> z >> A >> B >> C >> N;

   Do();
  }

  fin.close();
  fout.close();
}

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

  Mat_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] = 0;

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

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

void PrintMat()
{
  for( int i = 1; i <= 3; ++i )
  {
    for( int j = 1; j <= 3; ++j )
     fout << mat[i][j] << ' ';

    fout << '\n';
  }

  fout << '\n';
}

void Do()
{
  init[1][3] = C;
  init[2][3] = B;
  init[3][3] = A;
  init[2][1] = 1;
  init[3][2] = 1;

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

  Mat_exp( N - 2 );

  int ans = (( 1ll * x * mat[1][3] ) % MOD + ( 1ll * y * mat[2][3] ) % MOD + ( 1ll * z * mat[3][3] ) % MOD ) % MOD;

  fout << ans << '\n';
}

int main()
{
    Read();
    Do();

    return 0;
}