Cod sursa(job #1715345)

Utilizator cristina_borzaCristina Borza cristina_borza Data 10 iunie 2016 13:31:49
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <cstring>

#define MOD 666013

using namespace std;

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

long long a[5][5], p[5][5], aux[5][5];
int n , x , y , z , A , B , C , T;

void inmulteste() {
    memset(aux , 0 , sizeof(aux));
    for (int i = 1; i < 4; ++i) {
        for (int k = 1; k < 4; ++k) {
            for (int j = 1; j < 4; ++j) {
                aux[i][k] = (aux[i][k] + p[i][j] * a[j][k]) % MOD;
            }
        }
    }

    for (int i = 1; i < 4; ++i) {
        for (int j = 1; j < 4; ++j) {
            p[i][j] = aux[i][j];
        }
    }
}

void ridica() {
    memset(aux , 0 , sizeof(aux));

    for (int i = 1; i < 4; ++i) {
        for (int k = 1; k < 4; ++k) {
            for (int j = 1; j < 4; ++j) {
                aux[i][k] = (aux[i][k] + a[i][j] * a[j][k]) % MOD;
            }
        }
    }

    for (int i = 1; i < 4; ++i)
        for (int j = 1; j < 4; ++j)
            a[i][j] = aux[i][j];
}

int main() {
    f >> T;
    while(T--) {
        memset(a , 0 , sizeof(a));
        memset(p , 0 , sizeof(p));

        f >> x >> y >> z >> A >> B >> C >> n;
        n -= 2;

        a[1][1] = 0, a[1][2] = 0, a[1][3] = C;
        a[2][1] = 1, a[2][2] = 0, a[2][3] = B;
        a[3][1] = 0, a[3][2] = 1, a[3][3] = A;

        p[1][1] = x;
        p[1][2] = y;
        p[1][3] = z;

        while (n) {
            if (n % 2) {
                inmulteste();
                --n;
            }

            else {
                ridica();
                n /= 2;
            }
        }

        g << p[1][3] % MOD << '\n';
    }
    return 0;
}