Cod sursa(job #1011545)

Utilizator sebinechitasebi nechita sebinechita Data 16 octombrie 2013 22:10:00
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <cmath>
#include <queue>
#include <deque>
#include <iomanip>
#include <stack>
#include <cstdio>

using namespace std;

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

#define baza 10
#define MAX 1100
#define MOD 666013

void inmulteste(long long int a[][3], long long int b[][3])
{
    int a00, a01, a10, a02, a11, a12, a20, a21, a22;
    a00=(a[0][0]*b[0][0])%MOD+(a[0][1]*b[1][0])%MOD+(a[0][2]*b[2][0])%MOD;
    a01=(a[0][0]*b[0][1])%MOD+(a[0][1]*b[1][1])%MOD+(a[0][2]*b[2][1])%MOD;
    a02=(a[0][0]*b[0][2])%MOD+(a[0][1]*b[1][2])%MOD+(a[0][2]*b[2][2])%MOD;

    a10=(a[1][0]*b[0][0])%MOD+(a[1][1]*b[1][0])%MOD+(a[1][2]*b[2][0])%MOD;
    a11=(a[1][0]*b[0][1])%MOD+(a[1][1]*b[1][1])%MOD+(a[1][2]*b[2][1])%MOD;
    a12=(a[1][0]*b[0][2])%MOD+(a[1][1]*b[1][2])%MOD+(a[1][2]*b[2][2])%MOD;

    a20=(a[2][0]*b[0][0])%MOD+(a[2][1]*b[1][0])%MOD+(a[2][2]*b[2][0])%MOD;
    a21=(a[2][0]*b[0][1])%MOD+(a[2][1]*b[1][1])%MOD+(a[2][2]*b[2][1])%MOD;
    a22=(a[2][0]*b[0][2])%MOD+(a[2][1]*b[1][2])%MOD+(a[2][2]*b[2][2])%MOD;

    a[0][0]=a00%MOD;
    a[0][1]=a01%MOD;
    a[0][2]=a02%MOD;

    a[1][0]=a10%MOD;
    a[1][1]=a11%MOD;
    a[1][2]=a12%MOD;

    a[2][0]=a20%MOD;
    a[2][1]=a21%MOD;
    a[2][2]=a22%MOD;
}

void fa(long long int a[], long long int b[][3])
{
    int a0, a1, a2;
    a0=(a[0]*b[0][0])%MOD+(a[1]*b[1][0])%MOD+(a[2]*b[2][0])%MOD;
    a1=(a[0]*b[0][1])%MOD+(a[1]*b[1][1])%MOD+(a[2]*b[2][1])%MOD;
    a2=(a[0]*b[0][2])%MOD+(a[1]*b[1][2])%MOD+(a[2]*b[2][2])%MOD;
    a[0]=a0%MOD;
    a[1]=a1%MOD;
    a[2]=a2%MOD;
}

void multiply(long long int a[][3],long long int b[][3], int n)
{


    while(n)
    {
        if(n&1)
            inmulteste(b,a);
        inmulteste(a,a);
        n>>=1;
    }

}


long long int m[3];
long long int a[3][3], b[3][3];

int main()
{
    int i, j;
    int t, ki, X, Y, Z, A, B, C, N;
    fin>>t;
    for(ki=1;ki<=t;ki++)
    {
        fin>>X>>Y>>Z>>A>>B>>C>>N;

        m[0]=Z;
        m[1]=Y;
        m[2]=X;
        a[0][0]=A;
        a[1][0]=B;
        a[2][0]=C;
        a[1][2]=a[0][1]=1;
        a[0][2]=a[1][1]=a[2][1]=a[2][2]=0;

        for(i=0;i<=2;i++)
        {
            for(j=0;j<=2;j++)
            {
                if(j==i)
                    b[i][j]=1;
                else
                    b[i][j]=0;
            }
        }

        multiply(a,b,N);

        fa(m, b);

        fout<<m[2]<<"\n";

    }

    return 0;
}