Cod sursa(job #2924647)

Utilizator LuxinMatMatasaru Luxin Gabriel LuxinMat Data 6 octombrie 2022 23:03:29
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
using namespace std;

ifstream cin("iepuri.in");
ofstream cout("iepuri.out");

#define MOD 666013

struct matrix
{
    int _v[9];
    int& v(int i, int j) { return _v[i * 3 + j]; }
    int v(int i, int j) const { return _v[i * 3 + j]; }
} v, st;

void inmultire(matrix& rez, matrix a, matrix b, bool flag)
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            rez.v(i, j) = 0;

    int la = 3;
    int cb = 3;
    if(flag)
        cb = 1;

    for(int i=0; i<la; i++)
        for(int j=0; j<cb; j++)
            for(int k=0; k<3; k++)
                rez.v(i, j) = (rez.v(i,j) + a.v(i, k) * b.v(k, j) % MOD) % MOD;
}

void pow(matrix& p, matrix b, int exp)
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            p.v(i, j) = ((i==j) ? 1 : 0);

    while(exp != 0)
    {
        if(exp%2 == 1)
        {
            inmultire(p, b, p, 0);
            exp --;
        }
        else
        {
            inmultire(b, b, b, 0);
            exp /= 2;
        }
    }
}

int main()
{
    int t;
    int x, y, z, a, b, c, n;
    cin>>t;
    for(int i=1; i<=t; i++)
    {
        cin>>x>>y>>z>>a>>b>>c>>n;

        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
            {
                v.v(i, j) = 0;
                st.v(i, j) = 0;
            }
        v.v(0, 1) = 1;
        v.v(1, 2) = 1;
        v.v(2, 0) = c;
        v.v(2, 1) = b;
        v.v(2, 2) = a;

        st.v(0, 0) = x;
        st.v(1, 0) = y;
        st.v(2, 0) = z;
        pow(v, v, n-2);
        inmultire(st, v, st, 1);
        cout<<st.v(2, 0)<<'\n';
    }
    return 0;
}