Cod sursa(job #2153619)

Utilizator FredyLup Lucia Fredy Data 6 martie 2018 12:51:04
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define mod 666013
int t, x, y, z, a, b, c, n;
int mat[3][3], rez[3][3];

/// A = A*B
void mmult (int A[3][3], int B[3][3])
{
    int C[3][3];
    for (int i=0; i<3; i++) for (int j=0; j<3; j++) C[i][j] = 0;

    for (int i=0; i<3; i++)
        for (int j=0; j<3; j++)
            for (int k=0; k<3; k++)
                C[i][j] = 1LL* (C[i][j] + (1LL* A[i][k]*B[k][j])%mod) % mod;

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


void lgput (int p)
{
    for (int i=0; i<3; i++) for (int j=0; j<3; j++) rez[i][j]=mat[i][j];
    for (; p; p>>=1)
    {
        if (p&1)
            mmult (rez, mat);
        mmult (mat, mat);
    }

    for (int i=0; i<3; i++)
        for (int j=0; j<3; j++)
            mat[i][j] = rez[i][j];
}

int main()
{
    fin>>t;
    while (t--)
    {
        fin>>x>>y>>z>>a>>b>>c>>n;
        if (n<3)
        {
            if (n==0)   fout<<x<<'\n';
            if (n==1)   fout<<y<<'\n';
            if (n==2)   fout<<z<<'\n';
            continue;
        }
        mat[0][0]=0, mat[0][1]=1, mat[0][2]=0;
        mat[1][0]=0, mat[1][1]=0, mat[1][2]=1;
        mat[2][0]=c, mat[2][1]=b, mat[2][2]=a;
        lgput (n-3);        /// n-2
        long long rez = 1LL * (1LL*mat[2][0]*x%mod + 1LL*mat[2][1]*y%mod + 1LL*mat[2][2]*z%mod) % mod;
        fout<<rez%mod<<'\n';
    }

    return 0;
}