Cod sursa(job #2517538)

Utilizator Antonio020712Potra Antonio Antonio020712 Data 3 ianuarie 2020 18:23:45
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>

#define ll long long
#define mod 666013

using namespace std;

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

ll m[4][4], r[4][4];

void afisareMatrice(ll a[4][4]) {
    int i, j;

    for (i = 1; i <= 3; i++) {
        for (j = 1; j <= 3; j++)
            fout << a[i][j] << ' ';
        fout << '\n';
    }
    fout << '\n';
}

void copiere(ll destinatie[4][4], ll sursa[4][4]) {
    int i, j;

    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++)
            destinatie[i][j] = sursa[i][j];
}

void inmultireMatrici(ll a[4][4], ll b[4][4], ll c[4][4]) {
    int i, j, k;

    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++) {
            c[i][j] = 0;
            for (k = 1; k <= 3; k++)
                c[i][j] = (c[i][j] % mod + ((a[i][k] % mod) * (b[k][j] % mod)) % mod) % mod;
        }
}

void ridicareLaPutere(ll a[4][4], ll n) {
    int i, j;
    ll copie[4][4], aux[4][4];

    copiere(copie, a);

    while (n) {
        if (n % 2 == 1) {
            inmultireMatrici(r, copie, aux);
            copiere(r, aux);
        }
        n /= 2;
        inmultireMatrici(copie, copie, aux);
        copiere(copie, aux);
    }
}

int main() {
    int t, x, y, z, a, b, c, n, i;

    fin >> t;
    for (i = 1; i <= t; i++) {
        fin >> x >> y >> z >> a >> b >> c >> n;
        m[3][3] = a;
        m[3][2] = b;
        m[3][1] = c;
        m[2][3] = m[1][2] = 1;
        m[2][2] = m[2][1] = m[1][3] = m[1][1] = 0;
        r[1][1] = r[2][2] = r[3][3] = 1;
        r[1][2] = r[1][3] = r[2][1] = r[2][3] = r[3][1] = r[3][2] = 0;
        ridicareLaPutere(m, n);
        fout << r[1][1] * x + r[1][2] * y + r[1][3] * z << '\n';
    }

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

    return 0;
}