Cod sursa(job #1654211)

Utilizator pickleVictor Andrei pickle Data 16 martie 2016 21:31:04
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <algorithm>
#include <bitset>
#include <cmath>
#include <fstream>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <string>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");

const int M = 666013;

ll A[3][3], B[3][3], C[3][3];

void mult(ll a[][3], ll b[][3], ll c[][3]) {
  for(int i = 0; i < 3; ++i)
  for(int j = 0; j < 3; ++j)
    c[i][j] = (a[i][0]*b[0][j] + a[i][1]*b[1][j] + a[i][2]*b[2][j]) % M;
}

void pp(ll a[][3]) {
  cout << string(80, '=') << '\n';
  for (int i = 0; i < 3; ++i)
    cout << a[i][0] << ' ' << a[i][1] << ' ' << a[i][2] << '\n';
}

void go(int p) {
  memset(C, 0, sizeof(C));
  for(int i = 0; i < 3; ++i)
    C[i][i] = 1;
  while(p) {
    if (p & 1) {
      mult(C, A, B);
      //pp(B);
      memcpy(C, B, sizeof(B));

    }
    p /= 2;
    mult(A, A, B);
    memcpy(A, B, sizeof(B));
  }
}

int main() {
  int T, x, y, z, a, b, c, N;
  fin >> T;
  while(T--) {
    fin >> x >> y >> z >> a >> b >> c >> N;
    A[0][0] = a; A[0][1] = b; A[0][2] = c;
    A[1][0] = 1; A[1][1] = 0; A[1][2] = 0;
    A[2][0] = 0; A[2][1] = 1; A[2][2] = 0;
    go(N-2);
    //pp(C);
    fout << (C[0][0]*z + C[0][1]*y + C[0][2]*x) % M << endl;
  }


  return 0;
}