Cod sursa(job #701123)

Utilizator rusu_raduRusu Radu rusu_radu Data 1 martie 2012 13:47:08
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cassert>
#define Nmax 5
#define Mod 666013
#define InFile "iepuri.in"
#define OutFile "iepuri.out"
#define ll long long 

using namespace std;

int n, T, X, Y, Z, A, B, C;
long long Ax[Nmax][Nmax], S[Nmax][Nmax], M[Nmax][Nmax];

void inmult (ll A[Nmax][Nmax], ll B[Nmax][Nmax], int n, int m, int p);

int main()
{
  int i, j;
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  scanf ("%d\n", &T);
  while (T--)
  {
    scanf ("%d %d %d %d %d %d %d\n", &X, &Y, &Z, &A, &B, &C, &n);
    n-=2;
    for (i=1; i<=3; i++) for (j=1; j<=3; j++) S[i][j]=Ax[i][j]=0;
    M[1][1]=X; M[1][2]=Y; M[1][3]=Z;
    Ax[1][3]=C;
    Ax[2][1]=1; Ax[2][3]=B;
    Ax[3][2]=1; Ax[3][3]=A;
    for (i=1; i<=3; i++) S[i][i]=1;
    for (i=0; (1<<i)<=n && n; i++)
    {
      if (n&(1<<i))
        inmult (S, Ax, 3, 3, 3);
      inmult (Ax, Ax, 3, 3, 3);
    }
    inmult (M, S, 1, 3, 3);
    printf ("%lld\n", M[1][3]);
  }
  return 0;
}

void inmult (ll A[Nmax][Nmax], ll B[Nmax][Nmax], int n, int m, int p)
{
  int i, j, k, sum;
  int C[Nmax][Nmax];
  for (i=1; i<=n; i++)
    for (j=1; j<=p; j++)
    {
      sum=0;
      for (k=1; k<=m; k++)
        sum=((ll)(sum+((ll)(A[i][k]*B[k][j]))%Mod ))%Mod;
      C[i][j]=sum;
    }
  for (i=1; i<=n; i++)
    for (j=1; j<=p; j++)
      A[i][j]=C[i][j];
}