Cod sursa(job #2905140)

Utilizator MaraNNedelcu Mara MaraN Data 19 mai 2022 19:50:01
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 666013;
long long B[3][3], I[3][3];

void inmultire(long long M1[3][3], long long M2[3][3])
{
    // se inmultesc 2 matrice
    long long rez[3][3];
    for (int i = 0; i <= 2; i++)
        for (int j = 0; j <= 2; j++)
        {
            rez[i][j] = 0;
            for (int l = 0; l <= 2; l++)
                rez[i][j] += (M1[i][l] * M2[l][j]) % MOD;
        }

    // se copiaza produsul in prima matrice
    for (int i = 0; i <= 2; i++)
        for (int j = 0; j <= 2; j++)
            M1[i][j] = rez[i][j];
}

void ridicare(int exp)
{
    while (exp != 0)
    {
        if (exp % 2 == 0)
        {
            exp = exp / 2;
            inmultire(B, B);
            // se ridica baza la a doua
        }
        else
        {
            exp--;
            inmultire(I, B);
        }
    }
}

int main()
{
    ifstream fin ("iepuri.in");
    ofstream fout ("iepuri.out");
    int x, y, z, a, b, c, t, n;
    int i, j, l;
    fin >> t;
    for (i = 1; i <= t; i++)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;

        B[0][1] = 1;
        B[1][2] = 1;
        B[2][0] = c; B[2][1] = b; B[2][2] = a;
        I[0][0] = 1; I[1][1] = 1; I[2][2] = 1;

        ridicare (n-2);
        fout << ( (I[2][0] * x) + (I[2][1] * y) + (I[2][2] * z) ) % MOD << "\n";

        for (j = 0; j <= 2; j++)
        {
            for (l = 0; l <= 2; l++)
            {
                B[j][l] = 0;
                I[j][l] = 0;
            }
        }
    }
    fin.close();
    fout.close();

    return 0;
}