Cod sursa(job #2905187)

Utilizator VINTREXNume complet VINTREX Data 20 mai 2022 09:06:10
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

using namespace std;

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

long long bottom[3][3], copie[3][3];

void inmultire_matrici(long long a[3][3], long long b[3][3])
{
    long long auxiliar[3][3];
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            auxiliar[i][j]=0;
            for(int k=0; k<3; k++)
                auxiliar[i][j]+=(a[i][k]*b[k][j])%666013;
        }
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            a[i][j]=auxiliar[i][j];
}
void ridicare_la_putere(long long exponent)
{
    while(exponent)
        if(exponent%2==0)
            inmultire_matrici(bottom, bottom), exponent/=2;
        else
            exponent--, inmultire_matrici(copie, bottom);
}
int main()
{
    int numar_iepuri_1, numar_ziua_1, numar_ziua_2, numar_adunari_alaltaieri, numar_adunari_ieri, numar_adunari_vechi_vechi, ZIUA_APOCALIPTICA;
    long long seturi;
    fin >> seturi;
    for(long long i=1; i<=seturi; i++)
    {
        fin >> numar_iepuri_1 >> numar_ziua_1 >> numar_ziua_2 >> numar_adunari_ieri >> numar_adunari_alaltaieri >> numar_adunari_vechi_vechi >> ZIUA_APOCALIPTICA;
        bottom[0][0]=0;
        bottom[0][1]=1;
        bottom[0][2]=0;
        bottom[1][0]=0;
        bottom[1][1]=0;
        bottom[1][2]=1;
        bottom[2][0]=numar_adunari_vechi_vechi;
        bottom[2][1]=numar_adunari_alaltaieri;
        bottom[2][2]=numar_adunari_ieri;
        for(int k=0; k<3; k++)
            for(int l=0; l<3; l++)
                copie[k][l]=bottom[k][l];
        ridicare_la_putere(ZIUA_APOCALIPTICA-3);
        fout << ((copie[2][0]*numar_iepuri_1+numar_ziua_1*copie[2][1])%666013+copie[2][2]*numar_ziua_2)%666013 <<'\n';
        for(int k=0; k<3; k++)
            for(int l=0; l<3; l++)
                bottom[k][l]=0, copie[k][l]=0;
    }
}