Cod sursa(job #1809330)

Utilizator iAnduAlexandru Banu iAndu Data 18 noiembrie 2016 20:38:06
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#define SQUARE 3

using namespace std;

struct matrix {
    int mat[SQUARE][SQUARE];
};

void read(ifstream &in, int &x, int &y, int &z,
          int &a, int &b, int &c, int &n) {
    in >> x >> y >> z >> a >> b >> c >> n;
}

void initialize(matrix &var, int a, int b, int c) {
    var.mat[0][0] = var.mat[2][0] = var.mat[0][1] = var.mat[1][1] = 0;
    var.mat[1][0] = var.mat[2][1] = 1;
    var.mat[0][2] = c;
    var.mat[1][2] = b;
    var.mat[2][2] = a;
}

matrix multiply(matrix a, matrix b) {
    matrix aux;

    for (int i = 0; i < SQUARE; ++i) {
        for (int j = 0; j < SQUARE; ++j) {
            int s = 0;
            for (int k = 0; k < SQUARE; ++k) {
                s = (s + (a.mat[i][k] * b.mat[k][j]) % 666013) % 666013;
            }
            aux.mat[i][j] = s;
        }
    }

    return aux;
}

matrix expi(matrix a, int exp) {
    if (exp == 1) {
        return a;
    } else if (exp % 2) {
        return multiply(a, expi(a, exp - 1));
    } else {
        matrix aux = expi(a, exp / 2);
        return multiply(aux, aux);
    }
}

int dayN(matrix var, int x, int y, int z) {
    int s;

    s = ((x * var.mat[0][2]) % 666013 + (y * var.mat[1][2]) % 666013
        + (z * var.mat[2][2]) % 666013) % 666013;

    return s;
}

int main() {
    matrix var;
    int t, x, y, z, a, b, c, n, s;

    ifstream in("iepuri.in");
    ofstream out("iepuri.out");
    in >> t;

    for (int i = 0; i < t; ++i) {
        read(in, x, y, z, a, b, c, n);
        initialize(var, a, b, c);
        var = expi(var, n - 2);
        s = dayN(var, x, y, z);
        out << s << '\n';
    }

    in.close();
    out.close();

    return 0;
}