Cod sursa(job #2665673)

Utilizator alex02Grigore Alexandru alex02 Data 31 octombrie 2020 10:55:23
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>

#define MOD 666013
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

int n, m[3][3], x, y, z, a, b, c;

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

void inmulteste(int a[][3], int b[][3], int rez[][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                rez[i][j] = ((rez[i][j] % MOD) + (1ll * (a[i][k] % MOD) * (b[k][j] % MOD)) % MOD) % MOD;
            }
        }
    }
}

void afisare(int a[][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
}

void rezolvare() {
    m[0][0] = 0;
    m[0][1] = 0;
    m[0][2] = c;
    m[1][0] = 1;
    m[1][1] = 0;
    m[1][2] = b;
    m[2][0] = 0;
    m[2][1] = 1;
    m[2][2] = a;

    int r[3][3];
    r[0][0] = 1;
    r[0][1] = 0;
    r[0][2] = 0;
    r[1][0] = 0;
    r[1][1] = 1;
    r[1][2] = 0;
    r[2][0] = 0;
    r[2][1] = 0;
    r[2][2] = 1;
    while (n) {
        if (n % 2 == 1) {
            int aux_r[3][3] = {0};
            inmulteste(m, r, aux_r);
            copiaza(r, aux_r);
        }

        int aux_m[3][3] = {0};
        inmulteste(m, m, aux_m);
        copiaza(m, aux_m);
        n = n / 2;
    }
    ///afisare(m);
    g << ((1ll * x * r[0][2]) % MOD + (1ll * y * r[1][2]) % MOD + (1ll * z * r[2][2]) % MOD) % MOD<<endl;
}

int main() {
    int t;
    f >> t;
    cout<<t;
    for (int i = 0; i < t; i++) {
        f >> x >> y >> z >> a >> b >> c >> n;
        n-=2;
        rezolvare();
    }


    return 0;
}