Cod sursa(job #185658)

Utilizator alecmanAchim Ioan Alexandru alecman Data 25 aprilie 2008 19:18:13
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<cstdio>
#include<cstring>

#define INPUT "iepuri.in"
#define OUTPUT "iepuri.out"
#define CL(x) memset(x, 0, sizeof(x));
#define VMAX 4
#define MODULO 666013
#define NMAX 100
#define LL long long

int T, X, Y, Z, A, B, C, cont, Vec[ NMAX ];
LL N, Sum, P[ VMAX ][ VMAX ], Res[ VMAX ][ VMAX ], Mat[ VMAX ][ VMAX ], Init[ VMAX ];

void ReadNew()
{
  scanf("%d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C);
  scanf("%lld", &N);
}

void SetExp()
{
  for(cont = -1; N ;)
  {
    Vec[ ++cont ] = (N % 2 == 0) ? 0 : 1;
    N = (N % 2 == 0) ? (N/2) : (N - 1);
  }
}

void Multiply(int Code)
{
  int i, j, k;

  if(Code)
  {
    for(i = 1; i < VMAX; ++i)
    {
      for(j = 1; j < VMAX; ++j)
      {
	P[ i ][ j ] = 0;
	for(k = 1; k < VMAX; ++k)
	  P[ i ][ j ] += (Res[ i ][ k ] * Mat[ k ][ j ]) % MODULO, P[ i ][ j ] %= MODULO;
      }
    }

    memcpy(Res, P, sizeof(P));

  }
  else
  {
    for(i = 1; i < VMAX; ++i)
    {
      for(j = 1; j < VMAX; ++j)
      {
	P[ i ][ j ] = 0;
	for(k = 1; k < VMAX; ++k)
	  P[ i ][ j ] += (Res[ i ][ k ] * Res[ k ][ j ]) % MODULO, P[ i ][ j ] %= MODULO;
      }
    }

    memcpy(Res, P, sizeof(P));
  }
}

void InitMat()
{
  Mat[ 1 ][ 1 ] = 0, Mat[ 1 ][ 2 ] = 1, Mat[ 1 ][ 3 ] = 0;
  Mat[ 2 ][ 1 ] = 0, Mat[ 2 ][ 2 ] = 0, Mat[ 2 ][ 3 ] = 1;
  Mat[ 3 ][ 1 ] = C, Mat[ 3 ][ 2 ] = B, Mat[ 3 ][ 3 ] = A;
  Res[ 1 ][ 1 ] = 1, Res[ 1 ][ 2 ] = 0, Res[ 1 ][ 3 ] = 0;
  Res[ 2 ][ 1 ] = 0, Res[ 2 ][ 2 ] = 1, Res[ 2 ][ 3 ] = 0;
  Res[ 3 ][ 1 ] = 0, Res[ 3 ][ 2 ] = 0, Res[ 3 ][ 3 ] = 1;
  Init[ 1 ] = X, Init[ 2 ] = Y, Init[ 3 ] = Z;
}

void SolveFunction()
{
  int i;

  InitMat();

  while(cont >= 0)
    if(Vec[ cont-- ])
      Multiply(1);
    else Multiply(0);

  Sum = 0;

  for(i = 1; i < VMAX; ++i)
    Sum += (Res[ 1 ][ i ] * Init[ i ]) % MODULO, Sum %= MODULO;

  printf("%lld\n", Sum);
}

int main()
{
  freopen(INPUT, "r", stdin); freopen(OUTPUT, "w", stdout);

  scanf("%d", &T);

  while(T--)
  {
    CL(Vec); CL(Mat); CL(Res);

    ReadNew();

    SetExp();

    SolveFunction();
  }

  fclose(stdin); fclose(stdout);

  return 0;
}