Cod sursa(job #3273)

Utilizator vlad_popaVlad Popa vlad_popa Data 23 decembrie 2006 08:51:44
Problema Iepuri Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>

#define FIN "iepuri.in"
#define FOUT "iepuri.out"
#define nmax 4
#define FOR(i, a, b) for (i = (a); i <= (b); i++)

int a[33][nmax][nmax], i, j, n, A, B, C, x, y, z, t,
        b[33], k, ct, rez[nmax][nmax], I[nmax][nmax], sol;

void inmultire_putere (int ct)
{
  int i, j, k;
  FOR (i, 1, 3)
    FOR (j, 1, 3)
      FOR (k, 1, 3)
        a[ct][i][j] += (a[1][i][k] * a[ct-1][k][j]) % 666013;
}

void inmultire_mat (int put)
{
  int i, j, k, val;
  FOR (i, 1, 3)
    FOR (j, 1, 3)
     {
       I[i][j] = 0;
       FOR (k, 1, 3)
         I[i][j] += (rez[i][k] * a[put][k][j]) % 666013;
     }
  FOR (i, 1, 3)
    FOR (j, 1, 3)
      rez[i][j] = I[i][j];
}

int
 main ()
{
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);

  scanf ("%d", &t);
  while (t != 0)
   {
     FOR (k, 1, 32)
       FOR (i, 1, 3)
         FOR (j, 1, 3)
           a[k][i][j] = 0;
     FOR (i, 1, 3)
       FOR (j, 1, 3)
         rez[i][j] = I[i][j] = 0;
     scanf ("%d%d%d%d%d%d%d\n", &x, &y, &z, &A, &B, &C, &n);
     FOR (i, 1, 32)
       b[i] = n>>(32-i)&1;
     a[0][1][2] = a[0][2][3] = 1;
     a[0][3][1] = C; a[0][3][2] = B; a[0][3][3] = A;
     FOR (i, 1, 3)
       FOR (j, 1, 3)
         FOR (k, 1, 3)
           a[1][i][j] += (a[0][i][k] * a[0][k][j]) % 666013;
     FOR (ct, 2, 32)
       inmultire_putere (ct);
     rez[1][1] = rez[2][2] = rez[3][3] = 1;
     FOR (i, 1, 32)
       if (b[i] == 1)
         inmultire_mat (32-i);
     sol = (rez[1][1] * x + rez[1][2] * y + rez[1][3] * z) % 666013;
     printf ("%d\n", sol);
     t--;
   }
  return 0;
}