Cod sursa(job #2628899)

Utilizator euyoTukanul euyo Data 17 iunie 2020 22:21:42
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>

using namespace std;

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

const int MOD = 666013;

int rez[3][3];
int M[3][3];
int P[3][3];
int init[1][3];

void mul( int A[3][3], int B[3][3], int n, int m, int l ) { //n x m, m x l
  int i, j, k;	
  
  for ( i = 0; i < 3; ++i ) {
    for ( j = 0; j < 3; ++j ) {
	  rez[i][j] = 0; 
	}	
  }
  for ( i = 0; i < n; ++i ) {
    for ( j = 0; j < l; ++j ) {
	  for ( k = 0; k < m; ++k ) {
		rez[i][j] = (rez[i][j] + 1LL * A[i][k] * B[k][j]) % MOD;
	  }
	}	
  }	
}

void moveAtoB( int A[3][3], int B[3][3], int n, int m ) {
  int i, j;
	
  for ( i = 0; i < n; ++i ) {
	for ( j = 0; j < m; ++j ) {
	  B[i][j] = A[i][j];
	}	
  }
}

void quickExp( int n ) {
  while ( n > 0 ) {
    if ( n % 2 == 1 ) {
      mul( P, M, 3, 3, 3 );
      moveAtoB( rez, P, 3, 3 );
    }	    
	mul( M, M, 3, 3, 3 );
    moveAtoB( rez, M, 3, 3 );
    n /= 2;	
  }	
}

int main() {
  int t, i, j, r1, r2, r3, a, b, c, n;
   
  fin >> t;
  while ( t-- ) { 
    fin >> r1 >> r2 >> r3 >> a >> b >> c >> n;
    init[0][0] = r1; 
    init[0][1] = r2;	  
    init[0][2] = r3;  
	M[0][0] = 0;
    M[0][1] = 0;
    M[0][2] = c;
    M[1][0] = 1;
    M[1][1] = 0;
    M[1][2] = b;
    M[2][0] = 0;
    M[2][1] = 1;
    M[2][2] = a;
	for ( i = 0; i < 3; ++i ) {
	  for ( j = 0; j < 3; ++j ) {
		P[i][j] = 0;
	  }
	}
    P[0][0] = P[1][1] = P[2][2] = 1;
    mul( M, M, 3, 3, 3 );	
	quickExp( n - 2 );
    mul( init, P, 1, 3, 3 );
	fout << rez[0][2] << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}