Cod sursa(job #3148822)

Utilizator profinfo114Prof Info profinfo114 Data 4 septembrie 2023 15:54:32
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#define _GLIBCXX_FILESYSTEM
#include <bits/stdc++.h>
#define MOD 666013
using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
long long t, n;
long long a[3][3], r[3][3], aux[3][3], X, Y, Z, A, B, C, N;
void inmultire(long long a[3][3], long long b[3][3], long long c[3][3]){
    for(int i = 0; i <= 2; i++)
        for(int j = 0; j <= 2; j++) {
            c[i][j] = 0;
            for(int k = 0; k <= 2; k++){
                c[i][j] += a[i][k] * b[k][j];
                c[i][j] %= MOD;
            }
        }
}
void copiere(long long a[3][3], long long b[3][3]){
    for(int i = 0; i <= 2; i++)
        for(int j = 0; j <= 2; j++)
            a[i][j] = b[i][j];
}
void setid(long long a[3][3]){
    for(int i = 0; i <= 2; i++)
        for(int j = 0; j <= 2; j++)
            if(i == j)
                a[i][j] = 1;
            else
                a[i][j] = 0;
}
void setinit(long long x[3][3], long long a, long long b, long long c){
    x[0][0] = a; x[0][1] = b; x[0][2] = c;
    x[1][0] = 1; x[1][1] = 0; x[1][2] = 0;
    x[2][0] = 0; x[2][1] = 1; x[2][2] = 0;
}
int main(){
    for(fin >> t; t--;){
        fin >> X >> Y >> Z >> A >> B >> C >> N;
        setid(r);
        setinit(a, A, B, C);
        int b = N - 2;
        while(b){
            if(b % 2 == 1){
                inmultire(r, a, aux);
                copiere(r, aux);
            }
            inmultire(a, a, aux);
            copiere(a, aux);
            b /= 2;
        }
        fout << (r[0][0] * Z + r[0][1] * Y + r[0][2] * X) % MOD << '\n';
    }
    return 0;
}