Cod sursa(job #2282707)

Utilizator crion1999Anitei cristi crion1999 Data 14 noiembrie 2018 13:26:05
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
ifstream fi("iepuri.in");
ofstream fo("iepuri.out");
struct Matrix
{
    long long m[3][3];
};

Matrix Multiply(Matrix a, Matrix b)
{
    Matrix rez;
    for(int i = 0; i < 3; ++i)
    {
        for(int j = 0; j < 3; ++j)
        {
            rez.m[i][j] = 0;
            for(int k = 0; k < 3; ++k)
            {
                rez.m[i][j] = (rez.m[i][j] + a.m[i][k]* b.m[k][j]) % MOD;
            }
        }
    }

    return rez;
}
Matrix Pow(Matrix a, int n)
{
    Matrix rez;
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            if(i == j)
                rez.m[i][j] = 1;
            else
                rez.m[i][j] = 0;
    while(n)
    {
        if(n % 2)
            rez = Multiply(rez, a);

        a = Multiply(a,a);
        n /= 2;
    }
    return rez;
}

int main()
{

    long long x, y, z, t, n;
    fi>>t;
    while(t--)
    {
        Matrix rabbits;
        fi>>x>>y>>z;
        for(int i = 0; i < 3; ++i)
            for(int j = 0; j < 3; ++j)
                rabbits.m[i][j] = 0;

        for(int i = 2; i >= 0; --i)
            fi>>rabbits.m[2][i];
        rabbits.m[0][1] = 1;
        rabbits.m[1][2] = 1;

        fi>>n;
        rabbits = Pow(rabbits, n);
        fo<<(rabbits.m[0][0] * x + rabbits.m[0][1] * y + rabbits.m[0][2] * z) % MOD<<"\n";
    }

}