Cod sursa(job #2305758)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 20 decembrie 2018 23:52:50
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define MOD 666013
using namespace std;
typedef long long ll;
typedef pair< int , int > PII;

ll x, y, z, a, b, c, n;

void mult(ll b[3][3], ll m[3][3]) {
    ll rs[3][3] = {};

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            ll cnt = 0;
            for (int k = 0; k < 3; k++) {
                cnt += b[i][k] * m[k][j];
                cnt %= MOD;
            }

            rs[i][j] = cnt;
        }
    }

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            b[i][j] = rs[i][j];
}

void pw(ll mat[3][3], int p, ll rs[3][3]) {
    if (p <= 1) return ;
    pw(mat, p / 2, rs);
    mult(mat, mat);
    if (p & 1) mult(mat, rs);
}

int main(){
    ifstream cin("iepuri.in");
    ofstream cout("iepuri.out");

    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    int t;
    cin >> t;
        while (t--) {
        cin >> x >> y >> z >> a >> b >> c >> n;

        ll mat[3][3] = {{a, b, c}, {1, 0, 0}, {0, 1, 0}};
        ll rs[3][3] = {{a, b, c}, {1, 0, 0}, {0, 1, 0}};

        pw(mat, n - 2, rs);

        ll ans = mat[0][0] * z + mat[0][1] * y + mat[0][2] * x;
        cout << ans % MOD << "\n";
    }
	return 0;
}