Cod sursa(job #1310166)

Utilizator hrazvanHarsan Razvan hrazvan Data 6 ianuarie 2015 15:34:05
Problema Iepuri Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#define MOD 666013
int rezmat[3][3], mat[3][3], mat0[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}, mat1[3][3] = {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}};

inline void prod(int m1[3][3], int m2[3][3]){
  long long x;
  int i, j, k, m3[3][3];
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      x = 0;
      for(k = 0; k < 3; k++){
        x += 1LL * m1[i][k] * m2[k][j];
      }
      m3[i][j] = x % MOD;
    }
  }
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      m1[i][j] = m3[i][j];
    }
  }
}

inline void ridp(int x){
  while(x > 0){
    if(x & 1)
      prod(rezmat, mat);
    prod(mat, mat);
    x >>= 1;
  }
}

int main(){
  FILE *in = fopen("iepuri.in", "r");
  FILE *out = fopen("iepuri.out", "w");
  int t, i, j, k, x, y, z, a, b, c, n;
  fscanf(in, "%d", &t);
  for(i = 0; i < t; i++){
    fscanf(in, "%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n);
    for(j = 0; j < 3; j++){
      for(k = 0; k < 3; k++){
        rezmat[j][k] = mat0[j][k];
        mat[j][k] = mat1[j][k];
      }
    }
    mat[0][2] = a;
    mat[1][2] = b;
    mat[2][2] = c;
    ridp(n - 2);
    fprintf(out, "%lld\n", (1LL * x * rezmat[0][2] + 1LL * y * rezmat[1][2] + 1LL * z * rezmat[2][2]) % MOD);
  }
  fclose(in);
  fclose(out);
  return 0;
}