Cod sursa(job #1841283)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 5 ianuarie 2017 14:47:36
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MOD 666013

void inmultire(int a[3][3], int b[3][3]) {
    int res[3][3];

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            res[i][j] = 0;

            for (int k = 0; k < 3; k++) {
                res[i][j] += (long long) a[i][k] * b[k][j] % MOD;
            }
        }
    }

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            a[i][j] = res[i][j];
        }
    }
}

void putere(int m[3][3], int put, int a, int b, int c) {
    if (put == 1) {
        return;
    } else if (put % 2 == 1) {
        int m2[3][3] = {{0, 1, 0}, {0, 0, 1}, {c, b, a}};
        putere(m, put - 1, a, b, c);
        inmultire(m, m2);
        return;
    } else {
        putere(m, put / 2, a, b, c);
        inmultire(m, m);
    }
}

int main()
{
    ifstream fin("iepuri.in");
    ofstream fout("iepuri.out");

    int t, x, y, z, a, b, c, n, m[3][3], copie[2][3] = {{0, 1, 0}, {0, 0, 1}};

    fin >> t;

    for (int i = 0; i < t; i++) {
        fin >> x >> y >> z >> a >> b >> c >> n;

        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 3; k++) {
                m[j][k] = copie[j][k];
            }
        }

        m[2][0] = c;
        m[2][1] = b;
        m[2][2] = a;

        putere(m, n - 2, m[2][2], m[2][1], m[2][0]);

        fout << m[2][0] * x + m[2][1] * y + m[2][2] * z << endl;
    }

    fin.close();
    fout.close();

    return 0;
}