Cod sursa(job #1959450)

Utilizator dsergiu05Sergiu Druga dsergiu05 Data 9 aprilie 2017 15:18:07
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

using namespace std;

ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

typedef long long i64;

const int mod=666013;
i64 v[3], v2[3], m[3][3], m2[3][3], m3[3][3];

int main () {
    int q;
    fin>>q;

    for (int i=1; i<=q; i++) {
        int x, y, z, a, b, c, n;
        fin>>x>>y>>z>>a>>b>>c>>n;
        m[0][0]=0; m[0][1]=0; m[0][2]=c;
        m[1][0]=1; m[1][1]=0; m[1][2]=b;
        m[2][0]=0; m[2][1]=1; m[2][2]=a;
        v[0]=x;
        v[1]=y;
        v[2]=z;
        m2[0][0]=1; m2[0][1]=0; m2[0][2]=0;
        m2[1][0]=0; m2[1][1]=1; m2[1][2]=0;
        m2[2][0]=0; m2[2][1]=0; m2[2][2]=1;
        for (int j=1; j<=n-2; j*=2) {
            if (((n-2)&j)!=0) {
                for (int k=0; k<3; k++) {
                    for (int l=0; l<3; l++) {
                        m3[k][l]=0;
                        for (int p=0; p<3; p++) {
                            m3[k][l]+=m2[k][p]*m[p][l];
                        }
                    }
                }
                for (int k=0; k<3; k++) {
                    for (int l=0; l<3; l++) {
                        m2[k][l]=m3[k][l]%mod;
                    }
                }
            }
            for (int k=0; k<3; k++) {
                for (int l=0; l<3; l++) {
                    m3[k][l]=0;
                    for (int p=0; p<3; p++) {
                        m3[k][l]+=m[k][p]*m[p][l];
                    }
                }
            }
            for (int k=0; k<3; k++) {
                for (int l=0; l<3; l++) {
                    m[k][l]=m3[k][l]%mod;
                }
            }
        }
        for (int j=0; j<3; j++) {
            v2[j]=0;
            for (int k=0; k<3; k++) {
                v2[j]+=v[k]*m2[k][j];
            }
        }
        fout<<v2[2]%mod<<"\n";
    }

    return 0;
}