Cod sursa(job #2212226)

Utilizator LucaSeriSeritan Luca LucaSeri Data 13 iunie 2018 17:08:36
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

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

const long long MOD = 666013;

vector< vector< long long > > mult(vector< vector< long long > > a, vector< vector< long long > > b) {
    vector< vector< long long > > ret(3, vector< long long >(3));

    for(long long i = 0; i < 3; ++i) {
        for(long long j = 0; j < 3; ++j) {
            for(long long k = 0; k < 3; ++k) {
                ret[i][j] += (a[i][k]*b[k][j]%MOD);
                ret[i][j] %= MOD;
            }
        }
    }

    return ret;
}
vector< vector< long long > > raise(vector< vector< long long > > a, long long b) {
    vector< vector< long long > > ret(3, vector< long long >(3));
    for(int i = 0; i < 3; ++i) ret[i][i] = 1;
    while(b) {
        if(b&1) ret = mult(ret, a);
        a = mult(a, a);
        b >>= 1;
    }

    return ret;
}
void solve() {
    long long n, a, b, c, x, y ,z;
    f >> x >> y >> z >> a >> b >> c >> n;

    vector< vector< long long > > mat(3, vector< long long >(3));

    mat[1][0] = 1;
    mat[2][1] = 1;
    mat[0][2] = c;
    mat[1][2] = b;
    mat[2][2] = a;

    mat = raise(mat, n);

    long long ans =( x*mat[0][0] + y*mat[1][0] + z*mat[2][0] )% MOD;
    g << ans << '\n';
}
int main() {
    int t;
    f >> t;
    while(t--) solve();
    return 0;
}