Cod sursa(job #2629209)

Utilizator AokijiAlex M Aokiji Data 19 iunie 2020 15:42:33
Problema Iepuri Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <iostream>
#include <fstream>

#define mod 666013

using namespace std;

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

struct mat
{
    int m[3][3];
};

mat produs (mat a, mat b)
{
    mat rez;
    rez.m[0][0] = (1LL * a.m[0][0] * b.m[0][0] + 1LL * a.m[0][1] * b.m[1][0] + 1LL * a.m[0][2] * b.m[2][0]) % mod;
    rez.m[0][1] = (1LL * a.m[0][0] * b.m[0][1] + 1LL * a.m[0][1] * b.m[1][1] + 1LL * a.m[0][2] * b.m[2][1]) % mod;
    rez.m[0][2] = (1LL * a.m[0][0] * b.m[0][2] + 1LL * a.m[0][1] * b.m[1][2] + 1LL * a.m[0][2] * b.m[2][2]) % mod;
    rez.m[1][0] = (1LL * a.m[1][0] * b.m[0][0] + 1LL * a.m[1][1] * b.m[1][0] + 1LL * a.m[1][2] * b.m[2][0]) % mod;
    rez.m[1][1] = (1LL * a.m[1][0] * b.m[0][1] + 1LL * a.m[1][1] * b.m[1][1] + 1LL * a.m[1][2] * b.m[2][1]) % mod;
    rez.m[1][2] = (1LL * a.m[1][0] * b.m[0][2] + 1LL * a.m[1][1] * b.m[1][2] + 1LL * a.m[1][2] * b.m[2][2]) % mod;
    rez.m[2][0] = (1LL * a.m[2][0] * b.m[0][0] + 1LL * a.m[2][1] * b.m[1][0] + 1LL * a.m[2][2] * b.m[2][0]) % mod;
    rez.m[2][1] = (1LL * a.m[2][0] * b.m[0][1] + 1LL * a.m[2][1] * b.m[1][1] + 1LL * a.m[2][2] * b.m[2][1]) % mod;
    rez.m[2][2] = (1LL * a.m[2][0] * b.m[0][2] + 1LL * a.m[2][1] * b.m[1][2] + 1LL * a.m[2][2] * b.m[2][2]) % mod;
    return rez;
}
mat pow (mat n, int p)
{
    mat r;
    r.m[0][0] = 1;
    r.m[0][1] = 0;
    r.m[0][2] = 0;
    r.m[1][0] = 0;
    r.m[1][1] = 1;
    r.m[1][2] = 0;
    r.m[2][0] = 0;
    r.m[2][1] = 0;
    r.m[2][2] = 1;
    while (p)
    {
        if (p % 2 == 1)
            r = produs (r, n);
        n = produs (n, n);
        p /= 2;
    }
    return r;
}

int main ()
{
    int t, i, x, y, z, a, b, c, n;
    fin >> t;
    for (i = 1; i <= t; i ++)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;
        mat r;
        r.m[0][0] = 0;
        r.m[0][1] = 0;
        r.m[0][2] = c;
        r.m[1][0] = 1;
        r.m[1][1] = 0;
        r.m[1][2] = b;
        r.m[2][0] = 0;
        r.m[2][1] = 1;
        r.m[2][2] = a;
        r = pow (r, n - 2);
        /*cout << r.m[0][0] << " " << r.m[0][1] << " " << r.m[0][2] << "\n";
        cout << r.m[1][0] << " " << r.m[1][1] << " " << r.m[1][2] << "\n";
        cout << r.m[2][0] << " " << r.m[2][1] << " " << r.m[2][2] << "\n";*/
        fout << (x * r.m[0][2] + y * r.m[1][2] + z * r.m[2][2]) % mod << "\n";
    }
}