Cod sursa(job #2568692)

Utilizator Serban_sebastianSerban Sebastian Mihai Serban_sebastian Data 4 martie 2020 09:27:05
Problema Iepuri Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<bits/stdc++.h>
#define modulo 666013
using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
long long n, contor, i, j, k, x, y, z, A, B, C, t, p, a[4][4], b[4][4], c[4][4];

int main()
{
    fin >> t;
    for(contor=1; contor<=t; contor++)
    {
        fin >> x >> y >> z >> A >> B >> C >> n;
        if(n > 2)
        {
            a[1][1] = 0;
            a[1][2] = 0;
            a[1][3] = C;
            a[2][1] = 1;
            a[2][2] = 0;
            a[2][3] = B;
            a[3][1] = 0;
            a[3][2] = 1;
            a[3][3] = A;
            for(i=1; i<=3; i++)
                for(j=1; j<=3; j++)
                    if(i == j)
                        b[i][j] = 1;
                    else
                        b[i][j] = 0;
            for(p=0; (1 << p)<=n - 2; p++)
            {
                if(((1 << p) & (n - 2)) > 0)
                {
                    for(i=1; i<=3; i++)
                        for(j=1; j<=3; j++)
                        {
                            c[i][j] = 0;
                            for(k=1; k<=3; k++)
                                c[i][j] = (c[i][j] + (a[k][j] * b[i][k]) % modulo) % modulo;
                        }
                    for(i=1; i<=3; i++)
                        for(j=1; j<=3; j++)
                            b[i][j] = c[i][j] % modulo;
                }
                for(i=1; i<=3; i++)
                    for(j=1; j<=3; j++)
                    {
                        c[i][j] = 0;
                        for(k=1; k<=3; k++)
                            c[i][j] = (c[i][j] + (a[i][k] * a[k][j]) % modulo) % modulo;
                    }
                for(i=1; i<=3; i++)
                    for(j=1; j<=3; j++)
                        a[i][j] = c[i][j] % modulo;
            }
            fout << ((x * b[1][3]) % modulo + (y * b[2][3]) % modulo + (z * b[3][3]) % modulo) % modulo;
            fout << '\n';
        }
        if(n == 0)
            fout << x << '\n';
        if(n == 1)
            fout << y << '\n';
        if(n == 2)
            fout << z << '\n';
    }
}