Cod sursa(job #2168614)

Utilizator 24601Dan Ban 24601 Data 14 martie 2018 11:44:34
Problema Iepuri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <string.h>

typedef long long ll;
typedef ll mat_t[3][3];

#define MOD 666013

static mat_t Z, A;

static void lgput(ll k)
{
    mat_t C, AA;
    int i, j, l;

    if (k <= 1) {
        return;
    }

    memcpy(C, Z, sizeof C);

    lgput(k >> 1);

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            A[i][j] = 0;
            for (l = 0; l < 3; l++) {
                A[i][j] = (A[i][j] + (Z[i][l] * Z[l][j]) % MOD) % MOD;
            }
        }
    }

    memcpy(AA, A, sizeof AA);

    if (k & 1) {
        for (i = 0; i < 3; i++) {
            for (j = 0; j < 3; j++) {
                A[i][j] = 0;
                for (l = 0; l < 3; l++) {
                    A[i][j] = (A[i][j] + (AA[i][l] * C[l][j]) % MOD) % MOD;
                }
            }
        }
    }

    memcpy(Z, A, sizeof Z);
}

int main(void)
{
    ll t, x, y, z, a, b, c, n;

    freopen("iepuri.in", "r", stdin);
    freopen("iepuri.out", "w", stdout);

    scanf("%lld", &t);

    while (t--) {
        scanf("%lld %lld %lld %lld %lld %lld %lld", &x, &y, &z, &a, &b, &c, &n);

        Z[0][0] = Z[0][1] = Z[1][1] = Z[2][0] = 0;
        Z[1][0] = Z[2][1] = 1;
        Z[0][2] = c;
        Z[1][2] = b;
        Z[2][2] = a;

        lgput(n - 2);

        printf("%lld\n", ((x * Z[0][2]) % MOD + (y * Z[1][2]) % MOD + (z * Z[2][2]) % MOD) % MOD);
    }

    return 0;
}