Cod sursa(job #3281956)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 4 martie 2025 10:43:54
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
//S-O IA DRACU DE PROBLEMA!!
// https://www.geeksforgeeks.org/c-program-multiply-two-matrices/
#include <bits/stdc++.h>
#define ll long long

using namespace std;

ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");

/*
iepuri[n] = a * iepuri[n-1] + b * iepuri[n-2] + c * iepuri[n-3]\
fibonacci : f[i] = f[i-1] + f[i-2]
(f[i-1] f[i]  ) (0 1) Ridicata la puteri obtinem urmatorii termeni ai
(f[i]   f[i+1]) (1 1) sirului
Concluzie: trebuie gasita o noua matrice, care sa mearga pe acelasi
principiu pentru formula de la iepuri (TODO)
*/

const ll ct = 666013;

void multiply (ll a[3][3], ll b[3][3]) {
    ll rez[3][3]={{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            for (int q=0; q<3; q++) {
                rez[i][j]+=a[i][q]*b[q][j];
                if (rez[i][j]>=ct) rez[i][j]%=ct;
            }
        }
    }
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            a[i][j] = rez[i][j];
        }
    }
}

void display (ll a[3][3]) {
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            cout<<a[i][j]<<' ';
        }
        cout<<'\n';
    }
    cout<<'\n';
}

int main()
{
    fin.tie(0); fin.sync_with_stdio(false);
    int m; fin>>m;
    while (m--) {
        int x, y, z, a, b, c, n;
        fin>>x>>y>>z>>a>>b>>c>>n;
        ll abc[3][3]={{a, 1, 0}, {b, 0, 1}, {c, 0, 0}}, iepuri[3][3]={{z, y, x}, {0, 0, 0}, {0, 0, 0}};
        // Ignoram primele 3 zile si ingoram 1 la puterea constantelor, pt ca inmultirea finala va fi cu matricea iepurilor
        int new_power = n - 2;
        // int power_ct = new_power - 1;
        // ll rez[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
        while (new_power) {
            if (new_power%2==1) multiply(iepuri, abc);
            multiply(abc, abc);
            new_power/=2;
            // display(iepuri);
        }
        if (n==0) fout<<x<<'\n';
        else if (n==1) fout<<y<<'\n';
        else if (n==2) fout<<z<<'\n';
        else fout<<iepuri[0][0]<<'\n';
    }
    return 0;
}