Cod sursa(job #1465136)

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

#define MOD 666013

using namespace std;

void mult(int a[3][3], int b[3][3], int rez[3][3])
{
    int n = 3;
    int 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(int mat[3][3], int p)
{
    int 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()
{
    int m[3][3] = {{0, 0, c}, {1, 0, b}, {0, 1, a}};
    rise(m, day-2);
    return x * m[0][2] + y * m[1][2] + z * m[2][2];
}

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;
}