Cod sursa(job #1573970)

Utilizator euuuauraIvanciuc Aurica euuuaura Data 20 ianuarie 2016 01:39:58
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<fstream>
#include<iostream>
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
long long Fin[3], Aux[3][3], Sol[3][3];
int t, x, y, z, a, b, c, n;
const int MOD = 666013;
void citire ()
{
    in>>x>>y>>z>>a>>b>>c>>n;
}
void InmultireDoua(long long M[3][3], long long N[3][3])
{
    int i, j, k;
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            Aux[i][j] = 0;
        }
    }
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            for(k=0; k<3; k++)
                Aux[i][j] += M[i][k] * N[k][j];
            Aux[i][j] = Aux[i][j] % MOD;
        }
    }
}

void RidicareLaPutere(int p)
{
    long long Mf[3][3];
    int i, j;

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

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

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

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

void VectorOriMatrice(long long M[3], long long N[3][3])
{
    int i, j;
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            Fin[i] += M[j] * N[j][i];
        }
        Fin[i] = Fin[i] % MOD;
    }
}

int rez()
{
    long long Inc[3];

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

    RidicareLaPutere(n-2);

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

    VectorOriMatrice(Inc, Sol);

    out<<Fin[2]<<endl;
}

int main()
{
    in>>t;
    int i;
    for(i=0;i<t;i++)
    {
        citire();
        rez();
    }
    return 0;
}