Cod sursa(job #3041872)

Utilizator AlexAlAxAxelAlAx AlAx AlexAlAxAxel Data 2 aprilie 2023 02:44:07
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <bits/stdc++.h>
using namespace std;

#define MOD 666013

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

// C = A * B
void multiply_matrix(long long int A[3][3], long long int B[3][3], long long int C[3][3])
{
    long long int tmp[3][3];

    // tmp = A * B
    for (long long int i = 0; i <= 2; i++)
        for (long long int j = 0; j <= 2; j++)
        {
            tmp[i][j] = 0;

            for (long long int k = 0; k <= 2; k++)
                tmp[i][j] = (tmp[i][j] + (1LL * A[i][k] * B[k][j]) % MOD) % MOD;
        }

    //  C = tmp
    memcpy(C, tmp, sizeof(tmp));
}

// R = C^p
void power_matrix(long long int C[3][3], long long int p, long long int R[3][3])
{
    // tmp = I (matricea identitate)
    long long int tmp[3][3];
    for (long long int i = 0; i <= 2; i++)
        for (long long int j = 0; j <= 2; j++)
            tmp[i][j] = (i == j) ? 1 : 0;


    while (p != 1)
        if (p % 2 == 0)
        {
            multiply_matrix(C, C, C);     // C = C*C
            p = p / 2;                    // rămâne de calculat C^(p/2)
        }
        else
        {
            // reduc la cazul anterior:
            multiply_matrix(tmp, C, tmp); // tmp = tmp*C
            p--;                          // rămâne de calculat C^(p-1)
        }

    // avem o parte din rezultat în C și o parte în tmp
    multiply_matrix(C, tmp, R);           // rezultat = tmp * C
}

long long int solve_set(long long int x, long long int  y, long long int z, long long int a, long long int b, long long int c, long long int n)
{
    long long int C[3][3] = { {0, 0, c},
                              {1, 0, b},
                              {0, 1, a} };
    long long int C2[3][3];

    // C2 = C^(n-2)
    power_matrix(C, n - 2, C2);

    long long int sol = (x * C2[0][2]) % MOD + (y * C2[1][2]) % MOD + (z * C2[2][2]) % MOD;
    return sol % MOD;
}

int main()
{
    long long int T;
    f >> T;
    for (long long int i = 1, x, y, z, a, b, c, n;i <= T;i++)
    {
        f >> x >> y >> z >> a >> b >> c >> n;
        g << solve_set(x, y, z, a, b, c, n) << "\n";
    }

    return 0;
}