Cod sursa(job #3124149)

Utilizator divadddDavid Curca divaddd Data 27 aprilie 2023 01:25:44
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 666013;
int t,x,y,z,a,b,c,n;
int f[3][3],p[3][3],m[3][3],aux[3][3];

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

void mult(int a[3][3], int b[3][3], int c[3][3]){
    /// c = a*b
    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] += (a[i][k]*b[k][j])%MOD;
                if(c[i][j] > MOD){
                    c[i][j] -= MOD;
                }
            }
        }
    }
}

signed main()
{
    fin >> t;
    while(t--){
        memset(f, 0, sizeof(f));
        memset(m, 0, sizeof(m));
        memset(p, 0, sizeof(p));
        fin >> x >> y >> z >> a >> b >> c >> n;
        if(n == 1){
            fout << x << "\n";
            continue;
        }else if(n == 2){
            fout << y << "\n";
            continue;
        }else if(n == 3){
            fout << z << "\n";
            continue;
        }
        n -= 3;
        f[0][0] = z; f[1][0] = y; f[2][0] = x;
        /// f = [z]
        ///     [y]
        ///     [x]
        p[0][0] = p[1][1] = p[2][2] = 1;
        /// p = [1 0 0]
        ///     [0 1 0]
        ///     [0 0 1]
        m[0][0] = a; m[0][1] = b; m[0][2] = c;
        m[1][0] = m[2][1] = 1;
        /// m = [a b c]
        ///     [1 0 0]
        ///     [0 1 0]
        while(n){
            if(n&1){
                mult(p, m, aux);
                memcpy(p, aux, sizeof(aux));
            }
            mult(m, m, aux);
            memcpy(m, aux, sizeof(aux));
            n >>= 1;
        }
        mult(p, f, aux);
        memcpy(f, aux, sizeof(aux));
        fout << ((a*f[0][0])%MOD + (b*f[1][0])%MOD + (c*f[2][0])%MOD)%MOD << "\n";
    }
    return 0;
}