Cod sursa(job #2450792)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 24 august 2019 16:35:56
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <bits/stdc++.h>
#define MAX 131072
#define MOD 666013

using namespace std;

FILE *IN;

int T;
int X, Y, Z, A, B, C, N;
int finmat[3][3], mat[3][3], matx[3][3];

int sign, pos;
char f[MAX];

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign=1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

int matrixmult(int mat1[3][3], int mat2[3][3]){
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            finmat[i][j] = ((mat1[i][0] * mat2[0][j] % MOD + mat1[i][1] * mat2[1][j] % MOD) % MOD  + mat1[i][2] * mat2[2][j] % MOD ) % MOD;
        }
    }
}

int initmat(){
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            mat[i][j] = 0;
    mat[0][0] = A; mat[0][1] = 1;
    mat[1][0] = B; mat[1][2] = 1;
    mat[2][0] = C;
}

int cpmat(int mat1[3][3], int finmat1[3][3]){
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            mat1[i][j] = finmat1[i][j];
}

int afis(int mx[3][3]){
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            printf("%d ", mx[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int lgput(int N){
    if(N != 1){
        if(N % 2 == 0){
            matrixmult(mat, mat); cpmat(mat, finmat);
            lgput(N / 2);
        } else {
            cpmat(matx, mat);
            matrixmult(mat, mat); cpmat(mat, finmat);
            lgput((N - 1) / 2);
            matrixmult(matx, mat);
            cpmat(mat, finmat);
        }
    }
}

int main(){

    IN = fopen("iepuri.in", "r");
    freopen("iepuri.out", "w", stdout);

    Read(T);
    for(int i = 1; i <= T; i++){
        Read(X); Read(Y); Read(Z);
        Read(A); Read(B); Read(C);
        Read(N);
        initmat(); lgput(N - 2);
        int ans[3][3] = {Z, Y, X};
        matrixmult(ans, mat);
        printf("%d\n", finmat[0][0]);
    }


    return 0;
}