Cod sursa(job #3256809)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 16 noiembrie 2024 10:17:17
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MOD=666013;

void multiply2(int a[3][3], int b[3][3])
{
    long long c[3][3];
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            c[i][j]=0;
            for (int k=0; k<3; k++) {
                c[i][j]+=1LL*a[i][k]*b[k][j];  //% aici e mai costisitor decat adunarea long long
            }
            c[i][j]%=MOD; //% dureaza > long long
        }
    }
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            a[i][j]=c[i][j];
        }
    }
}

void multiply(int a[1][3], int b[3][3])
{
    long long c[1][3];
    for (int i=0; i<1; i++) {
        for (int j=0; j<3; j++) {
            c[i][j]=0;
            for (int k=0; k<3; k++) {
                c[i][j]+=1LL*a[i][k]*b[k][j];  //% aici e mai costisitor decat adunarea long long
            }
            c[i][j]%=MOD; //% dureaza > long long
        }
    }
    for (int i=0; i<1; i++) {
        for (int j=0; j<3; j++) {
            a[i][j]=c[i][j];
        }
    }
}

int main()
{
    fin.tie(0); fin.sync_with_stdio(false);
    int x, y, z, a, b, c, n, t;
    fin>>t;
    while (t--) {
        fin>>x>>y>>z>>a>>b>>c>>n;
        int iepuri[1][3]={{x, y, z}};
        int smecherie[3][3] = {{0, 0, c}, {1, 0, b}, {0, 1, a}};
        while (n) {
            if (n%2==1) {
                multiply(iepuri, smecherie);
                //display_mat(iepuri, 1, 3);
                //display_mat(m, 3, 3);
            }
            multiply2(smecherie, smecherie);
            n/=2;
        }
        if (n==0||n==1||n==2) fout<<iepuri[0][n]<<'\n';
        else {
            fout<<iepuri[0][n]<<'\n';
        }
    }
    return 0;
}
/*
(x, y, z) * (0, 0, c) = (y, z, ax+by+cz)
            (1, 0, b)
            (0, 1, a)
*/