Cod sursa(job #1323542)

Utilizator teoceltareconstantin teodor teoceltare Data 21 ianuarie 2015 10:43:08
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<fstream>
#include<cstring>

using namespace std;
typedef int64_t var;

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

const var MOD = 666013;

var INIT[3];
var KEY[3][3];
var i, j, k;
var AUX[3][3];
var RES[3][3];

void inmult(var M[3][3], var N[3][3], var R[3][3]) {
    for(i=0; i<3; i++) //ind linie pt M
        for(j=0; j<3; j++) {//ind coloana pt N
            AUX[i][j] = 0;
            for(k=0; k<3; k++) {//ind pt element
                AUX[i][j] += (M[i][k] * N[k][j])%MOD;
                AUX[i][j] %= MOD;
            }
        }
    for(i=0; i<3; i++)
        for(j=0; j<3; j++) {
            R[i][j] = AUX[i][j];
        }
}

void pow(var K[3][3], var n) {
    while(n) {
        if(n%2) {
            inmult(RES, K, RES);
            n--;
        } else {
            inmult(K, K, K);
            n /= 2;
        }
    }
}

int main() {
    var T, N, rez, A, B, C;
    fin>>T;
    while(T--) {
        fin>>INIT[0]>>INIT[1]>>INIT[2]>>A>>B>>C;

        KEY[0][0] = A; KEY[1][0] = B; KEY[2][0] = C;
        KEY[1][1] = KEY[0][2] = KEY[2][1] = KEY[2][2] = 0;
        KEY[0][1] = KEY[1][2] = 1;

        RES[0][0] = RES[1][1] = RES[2][2] = 1;
        RES[0][1] = RES[1][0] = RES[0][2] = RES[2][0] = RES[1][2] = RES[2][1] = 0;

        fin>>N;
        pow(KEY, N-2);

        rez = (INIT[2]*RES[0][0]) % MOD;
        rez += (INIT[1]*RES[1][0]) % MOD;
        rez += (INIT[0]*RES[2][0]) % MOD;
        rez %= MOD;

        fout<<rez<<'\n';
    }

}