Cod sursa(job #1940693)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 26 martie 2017 19:22:41
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <algorithm>

using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");

const int NMax = 5e4 + 5;
typedef long long ll;
const int inf = 1e9;
const int mod = 666013;

// din moment ce avem de calculat un element dintr-un sir cu recurenta
// se poate folosi exponentierea pe matrice pantru a afla rezultatul rapid

ll T,X,Y,Z,A,B,C,N;

void pw(ll[4][4],ll);
void prod(ll[4][4],ll[4][4]);
// prod(m1,m2) face inmultirea dintre matricele patratice de ordin 3 m1 si m2
// si pune rezultatul in matricea m1
// prod(base,exp) calculeaza rezultatul ridicarii la puterea exp a matricei base
// si pune rezultatul in matricea base

int main()
{
    in>>T;
    while (T--) {
        in>>X>>Y>>Z>>A>>B>>C>>N;

        ll matrice[4][4];
        matrice[1][1] = matrice[1][3] = matrice[2][1] = matrice[2][2] = 0;
        matrice[1][2] = matrice[2][3] = 1;
        matrice[3][1] = C;
        matrice[3][2] = B;
        matrice[3][3] = A;

        pw(matrice,N);

        ll st[4][4];
        for (int i=1;i<=3;++i) {
            for (int j=1;j<=3;++j) {
                st[i][j] = 0;
            }
        }
        st[1][1] = X;
        st[2][1] = Y;
        st[3][1] = Z;

        prod(matrice,st);

        out<<matrice[1][1]<<'\n';
    }

    in.close();out.close();
    return 0;
}

void pw(ll base[4][4],ll exp) {
    ll res[4][4];
    for (int i=1;i<=3;++i) {
        for (int j=1;j<=3;++j) {
            res[i][j] = 0;
        }
        res[i][i] = 1;
    }

    while (exp>0) {
        if ((exp & 1) == 1) {
            prod(res,base);
        }
        prod(base,base);
        exp >>= 1;
    }

    for (int i=1;i<=3;++i) {
        for (int j=1;j<=3;++j) {
            base[i][j] = res[i][j];
        }
    }
}

void prod(ll a[4][4],ll b[4][4]) {
    ll res[4][4];
    for (int i=1;i<=3;++i) {
        for (int j=1;j<=3;++j) {
            res[i][j] = 0;
        }
    }


    for (int i=1;i<=3;++i) {
        for (int j=1;j<=3;++j) {
            for (int k=1;k<=3;++k) {
                res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod;
            }
        }
    }

    for (int i=1;i<=3;++i) {
        for (int j=1;j<=3;++j) {
            a[i][j] = res[i][j];
        }
    }
}