Cod sursa(job #2058579)

Utilizator MrRobotMrRobot MrRobot Data 5 noiembrie 2017 20:41:03
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <iostream>
#include <fstream>
using namespace std;

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



/*void exp_log (long long M[3][3], int p)
{
    if(p == 0)
    {
        M[0][0]=1;
        M[0][1]=0;
        M[0][2]=0;
        M[1][0]=0;
        M[1][1]=1;
        M[1][2]=0;
        M[2][0]=0;
        M[2][1]=0;
        M[2][2]=1;
    }
    if(p == 1)
    {
        ///nu cred ca e nevoie
    }
    if (p%2 == 0)
    {
        inm_matr(M, MM);
        exp_log(MM, p/2);
    }


    if (p%2 == 1)
    {
        inm_matr(M, MM);
        exp_log(MM, (p-1)/2);
        inm_matr(M, MM);
        ///return inm_matr(A, exp_log(B, (p-1)/2));
    }
        ///return (n*exp_log((n*n), (p-1)/2));
}*/


long long M[3][3];

void inm_matr(long long M[3][3])
{
    long long MP[3][3]={0,0};
    int i, j, k;
    for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++)
            for(k = 0; k < 3; k++)
                MP[i][j] += (M[i][k] * M[k][j] % 666013);
    for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++)
            M[i][j] = MP[i][j];

}

void exp_log(long long M[3][3], int p)
{
    /*if(p == 1)
    if(p == 0)
    {
        M[0][0]=1;
        M[0][1]=0;
        M[0][2]=0;
        M[1][0]=0;
        M[1][1]=1;
        M[1][2]=0;
        M[2][0]=0;
        M[2][1]=0;
        M[2][2]=1;
    }*/

    if (p%2 == 0 && p>0)
    {
        inm_matr(M);
        exp_log(M, p/2);
    }


    if (p%2 == 1 && p>1)
    {
        int i, j, k;
        int M_vechi[3][3];
        for(i = 0; i < 3; i++)
            for(j = 0; j < 3; j++)
                M_vechi[i][j] = M[i][j];

        inm_matr(M);
        exp_log(M, (p-1)/2);

        long long MP[3][3]={0,0};
        for(i = 0; i < 3; i++)
            for(j = 0; j < 3; j++)
                for(k = 0; k < 3; k++)
                    MP[i][j] += (M[i][k] * M_vechi[k][j] % 666013);
        for(i = 0; i < 3; i++)
            for(j = 0; j < 3; j++)
                M[i][j] = MP[i][j];
    }
}


int main()
{
    int T, X, Y, Z, A, B, C;
    long long N;
    fin>>T;
    int i, j, k;
    for(k=1; k<=T; k++)
    {
        fin>>X>>Y>>Z>>A>>B>>C>>N;
        M[0][0]=0;
        M[0][1]=1;
        M[0][2]=0;
        M[1][0]=0;
        M[1][1]=0;
        M[1][2]=1;
        M[2][0]=C;
        M[2][1]=B;
        M[2][2]=A;
        exp_log(M, N);
        /*for(i=0; i<=2; i++)
        {
            for(j=0; j<=2; j++)
                cout<<M[i][j]<<" ";
            cout<<endl;
        }*/
        long long r;
        r = M[0][0]*X + M[0][1]*Y + M[0][2]*Z;
        fout<<r<<endl;
    }
}