Cod sursa(job #2136616)

Utilizator trifangrobertRobert Trifan trifangrobert Data 20 februarie 2018 00:58:46
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>

using namespace std;

const int MOD = 666013;
int X, Y, Z, A, B, C, N, t;
int a[5][5], b[5][5];
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

void Multiply(int x[][5], int y[][5])
{
    int aux[5][5], s = 0;
    for (int i = 1;i <= 3;++i)
        for (int j = 1;j <= 3;++j)
        {
            s = 0;
            for (int k = 1;k <= 3;++k)
                s = (1LL * s +  1LL * x[i][k] * y[k][j]) % MOD;
            aux[i][j] = s;
        }
    for (int i = 1;i <= 3;++i)
        for (int j = 1;j <= 3;++j)
            x[i][j] = aux[i][j];
}

void lgput(int exp)
{
    int unit[5][5];
    unit[1][1] = unit[2][2] = unit[3][3] = 1;
    unit[1][2] = unit[1][3] = unit[2][1] = unit[2][3] = unit[3][1] = unit[3][2] = 0;
    while (exp > 0)
    {
        if (exp & 1)
            Multiply(unit, a);
        Multiply(a, a);
        exp >>= 1;
    }
    for (int i = 1;i <= 3;++i)
        for (int j = 1;j <= 3;++j)
            a[i][j] = unit[i][j];
}

int main()
{
    fin >> t;
    for (int k = 1;k <= t;++k)
    {
        fin >> X >> Y >> Z >> A >> B >> C >> N;
        b[1][1] = X; b[1][2] = Y; b[1][3] = Z;
        a[1][1] = a[1][2] = a[2][2] = a[3][1] = 0;
        a[2][1] = a[3][2] = 1;
        a[1][3] = C; a[2][3] = B; a[3][3] = A;
        lgput(N - 2);
        Multiply(b, a);
        fout << b[1][3] << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}