Cod sursa(job #3041867)

Utilizator AlexAlAxAxelAlAx AlAx AlexAlAxAxel Data 2 aprilie 2023 02:19:04
Problema Iepuri Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 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(int A[3][3], int B[3][3], int C[3][3])
{
    int tmp[3][3];

    // tmp = A * B
    for (int i = 0; i <= 2; i++)
        for (int j = 0; j <= 2; j++)
        {
            unsigned long long sum = 0; // presupun că suma încape pe 64 de biți

            for (int k = 0; k <= 2; k++)
                sum += 1LL * A[i][k] * B[k][j];

            tmp[i][j] = sum % MOD;
        }

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

// R = C^p
void power_matrix(int C[3][3], int p, int R[3][3])
{
    // tmp = I (matricea identitate)
    int tmp[3][3];
    for (int i = 0; i <= 2; i++)
        for (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
}

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

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

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

int main()
{
    int T;
    f >> T;
    for (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;
}