Cod sursa(job #2108701)

Utilizator pistvanPeter Istvan pistvan Data 18 ianuarie 2018 18:46:42
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;

int T, N, X, Y, Z, a, b, c;

struct matrix
{
    int m[3][3];
};

matrix mult(matrix A, matrix B)
{
    matrix r;
    int i, j, k;
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)
            for (r.m[i][j]=0,k=0;k<3;k++)
                r.m[i][j]= (r.m[i][j] + A.m[i][k]*B.m[k][j])%666013;
    return r;

}

matrix exp(matrix base, int e)
{
    matrix r;
    for (int i=0;i<3;i++)
        for (int j=0;j<3;j++)
            r.m[i][j]=0;
    r.m[0][0]=r.m[1][1]=r.m[2][2]=1;
    if (e==0)
        return r;
    else if (e==1)
    {
        return base;
    }
    else
    {
        matrix tmp=exp(base, e/2);
        r=mult(tmp, tmp);
        if (e%2)
            r=mult(r, base);
        //for (int i=0;i<3;i++)
        //{
        //    for (int j=0;j<3;j++)
        //        cout<<r.m[i][j]<<' ';
        //    cout<<'\n';
        //}
        return r;
    }
}

int main()
{
    ifstream f("iepuri.in");
    ofstream g("iepuri.out");
    f>>T;
    matrix A;
    int er;
    while (T--)
    {
        f>>X>>Y>>Z>>a>>b>>c>>N;
        A.m[0][0]=a;
        A.m[0][1]=b;
        A.m[0][2]=c;
        A.m[1][0]=1;
        A.m[2][1]=1;
        A.m[1][1]=A.m[1][2]=0;
        A.m[2][0]=A.m[2][2]=0;
        A = exp(A, N-2);
        er=(A.m[0][0]*Z+A.m[0][1]*Y+A.m[0][2]*X)%666013;
        g<<er<<'\n';
    }

}