Cod sursa(job #2967340)

Utilizator bkoncsagKoncsag Beata bkoncsag Data 19 ianuarie 2023 13:54:14
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <fstream>
using namespace std;

#define modulo 666013


struct data {
    int x, y, z, a, b, c;
    long long n;
};

void init(int a, int b, int c, long long M[3][3]) {
    M[0][0] = 0;
    M[0][1] = 1;
    M[0][2] = 0;
    M[1][0] = 0;
    M[1][1] = 0;
    M[1][2] = 1;
    M[2][0] = c;
    M[2][1] = b;
    M[2][2] = a;
}

void multiply(long long M[3][3], long long S[3][3]) {
    long long x1, x2, x3, x4, x5, x6, x7, x8, x9;

    x1 = (M[0][0]*S[0][0])%modulo + (M[0][1]*S[1][0])%modulo + (M[0][2]*S[2][0])%modulo;
    x2 = (M[0][0]*S[0][1])%modulo + (M[0][1]*S[1][1])%modulo + (M[0][2]*S[2][1])%modulo;
    x3 = (M[0][0]*S[0][2])%modulo + (M[0][1]*S[1][2])%modulo + (M[0][2]*S[2][2])%modulo;
    x4 = (M[1][0]*S[0][0])%modulo + (M[1][1]*S[1][0])%modulo + (M[1][2]*S[2][0])%modulo;
    x5 = (M[1][0]*S[0][1])%modulo + (M[1][1]*S[1][1])%modulo + (M[1][2]*S[2][1])%modulo;
    x6 = (M[1][0]*S[0][2])%modulo + (M[1][1]*S[1][2])%modulo + (M[1][2]*S[2][2])%modulo;
    x7 = (M[2][0]*S[0][0])%modulo + (M[2][1]*S[1][0])%modulo + (M[2][2]*S[2][0])%modulo;
    x8 = (M[2][0]*S[0][1])%modulo + (M[2][1]*S[1][1])%modulo + (M[2][2]*S[2][1])%modulo;
    x9 = (M[2][0]*S[0][2])%modulo + (M[2][1]*S[1][2])%modulo + (M[2][2]*S[2][2])%modulo;

    M[0][0] = x1;
    M[0][1] = x2;
    M[0][2] = x3;
    M[1][0] = x4;
    M[1][1] = x5;
    M[1][2] = x6;
    M[2][0] = x7;
    M[2][1] = x8;
    M[2][2] = x9;

}

void powM(long long M[3][3], long long n, int a, int b, int c) {
    if (n==0 || n==1) {
        return;
    }

    powM(M, n/2, a, b, c);
    multiply(M, M);
    if (n%2 != 0) {
        long long S[3][3];
        init(a, b, c, S);
        multiply(M, S);
    }
}


long long sol(long long M[3][3], long long n, int x, int y, int z, int a, int b, int c) {
    powM(M, n, a, b, c);
    return (M[0][0]*x)%modulo + (M[0][1]*y)%modulo + (M[0][2]*z)%modulo;
}

int main()
{
    int t;
    long long M[3][3];

    data d[100];

    ifstream f("iepuri.in");
    ofstream g("iepuri.out");

    f >> t;

    for(int i = 0; i < t; i++) {
        //f >> x >> y >> z >> a >> b >> c >> n;
        f >>  d[i].x >> d[i].y >> d[i].z >> d[i].a >> d[i].b >> d[i].c >> d[i].n;
        //init(a, b, c, M);
        //g << sol(M, n, x, y, z, a, b, c) << "\n";
    }
    for(int i = 0; i < t; i++) {
        init(d[i].a, d[i].b,d[i].c, M);
        g << sol(M, d[i].n, d[i].x ,d[i].y ,d[i].z , d[i].a, d[i].b ,d[i].c) << "\n";
    }
}