Cod sursa(job #36604)

Utilizator crawlerPuni Andrei Paul crawler Data 23 martie 2007 19:19:49
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>

#define FOR(iii,aa,bb) for( iii = (aa) ; iii <= (bb) ; ++iii )

int modulo = 666013;

void mul(int A[4][4],int B[4][4])
 {
  int i,j,k;
  int rez[4][4] = {0};


  FOR(i,1,3)
   FOR(j,1,3)
    FOR(k,1,3)
     rez[i][j] = ( rez[i][j] + ((A[i][k] % modulo)* (B[k][j] % modulo)) % modulo) % modulo ;

     
  FOR(i,1,3)
   FOR(j,1,3)
    B[i][j] = rez[i][j];
 }


int main()
 {
  freopen("iepuri.in","r",stdin);
  freopen("iepuri.out","w",stdout);

  int t, a,b,c,x,y,z,n, i,j,ii, sol;

  int aux[4][4], rez[4][4];

  scanf("%d", &t);

  FOR(ii,1,t)
   {
    scanf("%d%d%d%d%d%d%d", &x,&y,&z,&a,&b,&c,&n);

    aux[1][1] = 0;aux[1][2] = 1;aux[1][3] = 0;
    aux[2][1] = 0;aux[2][2] = 0;aux[2][3] = 1;
    aux[3][1] = c;aux[3][2] = b;aux[3][3] = a;

    FOR(i,1,3)
     FOR(j,1,3)
      rez[i][j] = (i == j);


    while(n)
     {
      if(n % 2 == 1)
       mul(aux,rez);

      n /= 2;

      if(n)
       mul(aux,aux);
     }

    x %= modulo;
    y %= modulo;
    z %= modulo;

    sol = 0;
    sol = (sol + (x*rez[1][1]) ) % modulo;
    sol = (sol + (y*rez[1][2]) ) % modulo;
    sol = (sol + (z*rez[1][3]) ) % modulo;

    printf("%d\n", sol);
   }


  return 0;
 }