Cod sursa(job #780430)

Utilizator visanrVisan Radu visanr Data 20 august 2012 16:12:28
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;

#define MOD 666013

int X, Y, Z, A, B, C, T, N;
long long m[3][3], aux[3][3], a[3][3], m2[3][1], final[3][1];


void Inm1(long long a[][3], long long b[][3], long long c[][3])
{
     for(int i = 0; i < 3; i++)
             for(int j = 0; j < 3; j++)
                     for(int k = 0; k < 3; k++)
                             c[i][j] = (c[i][j] + 1LL * a[i][k] * b[k][j]) % MOD;
}

void Inm2()
{
     for(int i = 0; i < 3; i++)
             for(int j = 0; j < 1; j++)
                     for(int k = 0; k < 3; k++)
                             final[i][j] = (final[i][j] + m[i][k] * m2[k][j]) % MOD;
}


void lgput(int pwr)
{
     pwr --;
     while(pwr)
     {
            if(pwr & 1)
            {
                   memset(aux, 0, sizeof(aux));
                   Inm1(m, a, aux);
                   memcpy(m, aux, sizeof(aux));
                   pwr --;
            }
            memset(aux, 0, sizeof(aux));
            Inm1(a, a, aux);
            memcpy(a, aux, sizeof(aux));
            pwr >>= 1;
     }
}

int main()
{
    freopen("iepuri.in", "r", stdin);
    freopen("iepuri.out", "w", stdout);
    int i;
    scanf("%i", &T);
    for(i = 1; i <= T; i++)
    {
          scanf("%i %i %i %i %i %i %i", &X, &Y, &Z, &A, &B, &C, &N);
          memset(m, 0, sizeof(m));
          memset(a, 0, sizeof(a));
          memset(aux, 0, sizeof(aux));
          memset(m2, 0, sizeof(m2));
          memset(final, 0, sizeof(final));
          m[0][1] = m[1][2] = a[0][1] = a[1][2] = 1;
          m[2][0] = a[2][0] = C;
          m[2][1] = a[2][1] = B;
          m[2][2] = a[2][2] = A;
          lgput(N);
          m2[0][0] = X;
          m2[1][0] = Y;
          m2[2][0] = Z;
          Inm2();
          printf("%i\n", final[0][0]);
    }
    return 0;
}