Cod sursa(job #1562853)

Utilizator RodoetTeodor Darie Rodoet Data 5 ianuarie 2016 15:32:18
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 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=1; j<4; 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[1] = x;
    Inc[2] = y;
    Inc[3] = z;
 
    VectorOriMatrice(Inc, Sol);
 
    out<<Fin[3]<<endl;
}
 
int main()
{
    in>>t;
	int i;
    for(i=0;i<t;i++)
	{
		citire();
        rez();
    }
    return 0;
}