Cod sursa(job #2842988)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 1 februarie 2022 20:16:26
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <iostream>
#include <algorithm>

#define MOD 666013

using namespace std;

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

const int NMAX = 3;
int v[NMAX][NMAX];
int copie[NMAX][NMAX];
int puteri[NMAX][NMAX];
int sum[NMAX][NMAX];

void solve(int copie[NMAX][NMAX], int v[NMAX][NMAX], int sum[NMAX][NMAX]) {
    int i, j, k, n;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++) {
            sum[i][j] = 0;
            for (k = 0; k < 3; k++)
                sum[i][j] = ((sum[i][j] % MOD) + 1LL * copie[i][k] * v[k][j]) % MOD;
        }
}

void schimb(int copie[NMAX][NMAX], int v[NMAX][NMAX]) {
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            copie[i][j] = v[i][j];
}

void power(int n) {
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            puteri[i][j] = 0;
    puteri[0][0] = 1;
    puteri[1][1] = 1;
    puteri[2][2] = 1;
    while (n) {
        if (n % 2 == 1) {
            solve(puteri, copie, v);
            schimb(puteri, v);
        }
        n = n / 2;
        solve(copie, copie, v);
        schimb(copie, v);
    }
}

void cleart(int copie[NMAX][NMAX]) {
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            copie[i][j] = 0;
    copie[1][0] = 1;
    copie[2][1] = 1;
}

int main() {
    int t, s, x, y, z, a, b, c, i, j, n;
    long long s1, s2, s3;
    fin >> t;
    for (i = 1; i <= t; i++) {
        fin >> x >> y >> z >> a >> b >> c >> n;
        cleart(copie);
        copie[2][2] = a;
        copie[1][2] = b;
        copie[0][2] = c;
        power(n - 2);
        s1 = 1LL * x * puteri[0][2];
        s2 = 1LL * y * puteri[1][2];
        s3 = 1LL * z * puteri[2][2];
        s = (s1 + s2 + s3) % MOD;
        fout << s << "\n";
    }
    return 0;
}