Cod sursa(job #1559461)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 30 decembrie 2015 20:56:11
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<fstream>
#include<iostream>
#include<cstring>

using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

long long Fin[4], Aux[4][4];
int Sol[4][4];
int t, x, y, z, a, b, c, n;
int const MOD = 666013;

void citire()
{
    f>>x>>y>>z>>a>>b>>c>>n;
}

void Mult(int M[4][4], int N[4][4])
{
    int i, j, k;
    for(i=1; i<4; i++)
        for(j=1; j<4; j++)
            Aux[i][j] = 0;

    for(i=1; i<4; i++)
        for(j=1; j<4; j++){
            for(k=1; k<4; k++)
                Aux[i][j] += 1LL * (M[i][k] * N[k][j]);
            Aux[i][j] = Aux[i][j] % MOD;
        }
}

void Pow(int p)
{
    int Mf[4][4], i, j;

    for(i=1; i<4; i++)
        for(j=1; j<4; j++)
            Mf[i][j] = 0;

    Mf[2][1] = 1;
    Mf[3][2] = 1;
    Mf[1][3] = c;
    Mf[2][3] = b;
    Mf[3][3] = a;

    while(p){
        if(p%2 == 1){
            Mult(Sol, Mf);
            for(i=1; i<4; i++)
                for(j=1; j<4; j++)
                    Sol[i][j] = Aux[i][j];
        }
        Mult(Mf, Mf);

        for(i=1; i<4; i++)
            for(j=1; j<4; j++)
                Mf[i][j] = Aux[i][j];
        p = p/2;
    }
}

void MultArr(int M[4], int N[4][4])
{
    int i, j;
    for(i=1; i<4; i++){
        Fin[i] = 0;
        for(j=1; j<4; j++)
            Fin[i] += 1LL * (M[j] * N[j][i]);
        Fin[i] = Fin[i] % MOD;
    }
}

int rez()
{
    int Inc[4];

    for(int i=1; i<4; i++)
        for(int j=1; j<4; j++){
            Sol[i][j] = 0;
            if(i==j)
                Sol[i][j] = 1;
        }

    Pow(n-2);

    Inc[1] = x;
    Inc[2] = y;
    Inc[3] = z;

    MultArr(Inc, Sol);

    g<<Fin[3]<<"\n";
}

int main()
{
    f>>t;
    while(t--){
        citire();
        rez();
    }
    return 0;
}