Cod sursa(job #1465139)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 26 iulie 2015 16:08:14
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <cstdio>

#define MOD 666013
#define LL long long

using namespace std;

void mult(LL a[3][3], LL b[3][3], LL rez[3][3])
{
    int n = 3;
    LL aux[n][n];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            aux[i][j] = 0;
    for (int i = 0; i < n; i++) // a lines
        for (int j = 0; j < n; j++) // b columns
            for (int k = 0; k < n; k++) // b lines / a columns
                aux[i][j] = (aux[i][j] + (b[k][j]*a[i][k])%MOD)%MOD;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            rez[i][j] = aux[i][j];
}

int t, x, y, z, a, b, c, day;

void printMat(int mat[3][3])
{
    // debug
    for (int i = 0; i < 3; i++, printf("\n"))
        for (int j = 0; j < 3; j++)
            printf("%d ", mat[i][j]);
}

void rise(LL mat[3][3], int p)
{
    LL rez[3][3];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            rez[i][j] = i==j ? 1 : 0;
    for (int i = 0; p>>i; i++)
    {
        if ((p>>i)&1)
            mult(rez, mat, rez);
        mult(mat, mat, mat);
    }
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            mat[i][j] = rez[i][j];
}

int solve()
{
    LL m[3][3] = {{0, 0, c}, {1, 0, b}, {0, 1, a}};
    rise(m, day-2);
    return (x * m[0][2])%MOD + (y * m[1][2])%MOD + (z * m[2][2])%MOD;
}

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

    scanf("%d", &t);
    for (int i = 0; i < t; i++)
    {
        scanf("%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &day);
        if (i) printf("\n%d", solve());
        else printf("%d", solve());
    }
    return 0;
}