Cod sursa(job #108067)

Utilizator floringh06Florin Ghesu floringh06 Data 21 noiembrie 2007 14:57:03
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <fstream>

#define FIN "iepuri.in"
#define FOUT "iepuri.out"

const long long P=666013;

long long M[4][4];
long long M0[4][4];
long long T, N, X, Y, Z, A, B, C;

void MULT1()
{
     long long i,j,k,s;
     long long X[4][4];
     memset(X,0,sizeof(X));
     for (i = 1; i <= 3; ++i)
         for (j = 1; j <= 3; ++j)
         {
             s = 0;
             for (k = 1; k <= 3; ++k)
                 s+=(M[i][k]*M[k][j]) % P;
             X[i][j] = s % P;
         }
     memcpy(M,X,sizeof(X));    
     for (i = 1; i <= 3; ++i)
         for (j = 1; j <= 3; ++j)
         {
             s = 0;
             for (k = 1; k <= 3; ++k)
                 s+=(M[i][k]*M0[k][j]) % P;
             X[i][j] = s % P;
         }    
     memcpy(M,X,sizeof(X));
}     

void MULT2()
{
     long long i,j,k,s;
     long long X[4][4];
     memset(X,0,sizeof(X));
     for (i = 1; i <= 3; ++i)
         for (j = 1; j <= 3; ++j)
         {
             s = 0;
             for (k = 1; k <= 3; ++k)
                 s+=(M[i][k]*M[k][j]) % P;
             X[i][j] = s % P;
         }
     memcpy(M,X,sizeof(X));    
}     


void solve ()
{
     long long Bit[100], k = 0;
     long long i, j, s;
     memset (Bit, 0, sizeof (Bit));
     while (N)
     {
           Bit[++k] = N%2;
           N>>=1;
     }
     // initializez matricea
     memset (M0, 0, sizeof (M0));
     M0[1][2] = 1; M0[2][3] = 1; M0[3][1] = C; M0[3][2] = B; M0[3][3] = A;
     memcpy(M, M0, sizeof (M));
     
     for (i = k - 1; i; --i)
         if (Bit[i]) MULT1();
            else MULT2();
            
     long long Sol;
     Sol = (M[1][1] * X)%P;
     Sol = (Sol + M[1][2] * Y)%P;
     Sol = (Sol + M[1][3] * Z)%P;
     printf ("%lld\n", Sol);
}

int main ()
{
    freopen (FIN, "r", stdin);
    freopen (FOUT, "w", stdout);
    
    scanf ("%lld", &T);
    
    while (T)
    {
          scanf ("%lld %lld %lld %lld %lld %lld %lld", &X, &Y, &Z, &A, &B, &C, &N);
          solve ();
          --T;
    }
    return 0;
}