Cod sursa(job #814755)

Utilizator ciorile.chioareBogatu Adrian ciorile.chioare Data 15 noiembrie 2012 23:41:52
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<cstdio>

#define N_MAX 666013

int inm(int a[3][3], int b[3][3], int rez[3][3]) {

  int rez2[3][3] = {0};
  for(int i = 0; i < 3; ++i) {
    for(int j = 0; j < 3; ++j) {
      for(int k = 0; k < 3; ++k)
        rez2[i][j] += a[i][k]* b[k][j] % N_MAX;
    }
  }
  for(int i = 0; i < 3; ++i)
    for(int j = 0; j < 3; ++j) {
      rez[i][j] = rez2[i][j];
    }
}

const int I[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};

void cpy(const int a[3][3], int b[3][3]) {
  for(int i = 0; i < 3; ++i)
    for(int j = 0; j < 3; ++j)
      b[i][j] = a[i][j];
}

void put(int a[3][3], int p, int rez[3][3]) {
  cpy(I, rez);
  for(; p; p >>= 1) {
    if(p & 1) {
      inm(a, rez, rez);
    }
    inm(a, a, a);
  }
}

void citire(int m[3][3]) {
  for(int i = 0; i < 3; ++i)
    for(int j = 0; j < 3; ++j)
      fscanf(stdin, "%d", &m[i][j]);
  fprintf(stdout, "\n");
}

void afis(const int m[3][3]) {
  for(int i = 0; i < 3; ++i) {
    for(int j = 0; j < 3; ++j)
      fprintf(stdout, "%3d ", m[i][j]);
    fprintf(stdout, "\n");
  }
}

int main() {

  FILE *in = fopen("iepuri.in", "r");
  FILE *out = fopen("iepuri.out", "w");

  int T;
  int n;
  int M[3];

  int rez[3][3];

  fscanf(in, "%d", &T);
  while(T--) {
    int KM[3][3] = {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}};
    fscanf(in, "%d%d%d%d%d%d%d", &M[2], &M[1], &M[0], &KM[0][0], &KM[1][0], &KM[2][0], &n);

    put(KM, n - 2, rez);
    int sol = 0;
    for(int i = 0; i < 3; ++i)
      sol += M[i] * rez[i][0] % N_MAX;
    fprintf(out, "%d\n", sol);
  }

  return 0;
}