Cod sursa(job #2264177)

Utilizator q1e123Solca Robert-Nicolae q1e123 Data 19 octombrie 2018 20:55:43
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#define  nr 666013
std::ifstream INPUT_FILE("iepuri.in");
std::ofstream OUTPUT_FILE("iepuri.out");

long long A[3][3],I[3][3],T, x, y, z, a, b, c, n;
void init(){
    for(long i=0;i<3;i++){
        for(long j=0;j<3;j++){
            if(i==j) I[i][j]=1;
            else I[i][j]=0;
        }
    }

    A[0][0]=0;
    A[0][1]=0;
    A[0][2]=c;
    A[1][0]=1;
    A[1][1]=0;
    A[1][2]=b;
    A[2][0]=0;
    A[2][1]=1;
    A[2][2]=a;
}

void multiply(long long A[3][3], long long B[3][3]){
    long long tmp[3][3];
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++) tmp[i][j]=0;
    }

    for (int i = 0; i<3; i++){
        for (int j = 0; j<3; j++){
            for (int k = 0; k<3; k++) tmp[i][j] = (tmp[i][j]+A[i][k]*B[k][j])%nr;
        }
    }

    for (int i = 0; i<3; i++){
        for (int j = 0; j<3; j++) A[i][j] = tmp[i][j];
    }
}


void rowRowFightThePower(long long k) {
    if(k>1){
        if(k%2){
            multiply(I,A);
            rowRowFightThePower(k-1);
        }else{
            multiply(A, A);
            rowRowFightThePower(k/2);
        }
    }else return;
}

int main()
{
    /*init();
    INPUT_FILE>> k;
    rowRowFightThePower(k);
    //multiply(M,Z);
    OUTPUT_FILE << M[1][0];*/
    INPUT_FILE>>T;
    for (int i = 0; i < T; ++i) {
        INPUT_FILE>>x>>y>>z>>a>>b>>c>>n;
        init();
        rowRowFightThePower(n-2);
        multiply(A,I);
        long long result = (( x * A[0][2]) % nr + ( y * A[1][2]) % nr + (z * A[2][2]) % nr) % nr;
        OUTPUT_FILE<<result<<"\n";
    }
}