Cod sursa(job #1368824)

Utilizator MoneaVladMonea Vlad MoneaVlad Data 2 martie 2015 20:11:24
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#define p 666013

using namespace std;

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

void pow(long long A[3][3], long long B[3][3], long long C[3][3]) {
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            C[i][j] = 0;
            for(int k = 0; k < 3; k++) {
                C[i][j] += (A[i][k] * B[k][j]) % p;
                C[i][j] %= p;
            }
        }
    }
}

void cpy(long long A[3][3], long long B[3][3]) {
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            A[i][j] = B[i][j];
        }
    }
}

int main()
{
    int x, y, z, a, b, c, t, i;
    long long n;
    in >> t;
    for(i = 1; i <= t; i++) {
        in >> x >> y >> z >> a >> b >> c >> n;
        long long A[3][3] = { {a, b, c}, {1, 0, 0}, {0, 1, 0} };
        long long r[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
        long long B[3][3];
        n -= 2;
        while(n) {
            if(n % 2 != 0) {
                pow(r, A, B);
                cpy(r, B);
            }
            pow(A, A, B);
            cpy(A, B);
            n /= 2;
        }
        out << (((z * r[0][0]) % p + y * r[0][1]) % p + x * r[0][2] % p) % p << "\n";
    }
    in.close();
    out.close();
    return 0;
}