Cod sursa(job #3265192)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 27 decembrie 2024 20:48:57
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#define mod 666013
#define int long long
using namespace std;

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

int a[4][4], sol[4][4], v[3];

void inmultire(int a[4][4], int b[4][4]) {
    int c[4][4] = {0};
    for (int i = 0; i < 3; i++) {   // Modificat de la 1 la 0 pentru a respecta indexarea standard
        for (int j = 0; j < 3; j++) {  // Modificat de la 1 la 0
            int val = 0;
            for (int k = 0; k < 3; k++) {  // Modificat de la 1 la 0
                val = (val + a[i][k] * b[k][j]) % mod;
            }
            c[i][j] = val;
        }
    }
    for (int i = 0; i < 3; i++) {   // Modificat de la 1 la 0
        for (int j = 0; j < 3; j++) {  // Modificat de la 1 la 0
            a[i][j] = c[i][j];
        }
    }
}

void power(int n) {
    while (n) {
        if (n % 2) inmultire(sol, a);
        n /= 2;
        inmultire(a, a);
    }
}

signed main() {
    int q;
    f >> q;
    while (q--) {
        f >> v[0] >> v[1] >> v[2];
        int x, y, z, k;
        f >> x >> y >> z >> k;

        if (k == 0) {
            g << v[0] % mod << '\n';
            continue;
        }
        if (k == 1) {
            g << v[1] % mod << '\n';
            continue;
        }
        if (k == 2) {
            g << v[2] % mod << '\n';
            continue;
        }

        for (int i = 0; i < 3; i++) {   // Modificat de la 1 la 0
            for (int j = 0; j < 3; j++) {  // Modificat de la 1 la 0
                if (i != j) sol[i][j] = 0;
                else sol[i][j] = 1;
            }
        }

        for (int i = 0; i < 3; i++) {   // Modificat de la 1 la 0
            for (int j = 0; j < 3; j++) {  // Modificat de la 1 la 0
                a[i][j] = 0;
            }
        }

        // Inițializăm matricea de tranziție
        a[1][0] = a[2][1] = 1;  // Corectarea matricii pentru a respecta formula
        a[0][2] = z; a[1][2] = y; a[2][2] = x;

        power(k - 2);

        // Calculăm numărul de iepuri pentru ziua k
        g << (v[0] * sol[0][2] + v[1] * sol[1][2] + v[2] * sol[2][2]) % mod << '\n';
    }
}