Cod sursa(job #1205166)

Utilizator andreiiiiPopa Andrei andreiiii Data 5 iulie 2014 15:50:17
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;

const int MOD = 666013;

class Matrix {
public:
    Matrix(const int N = 0):
        A{0}
        {
            if (N == 1)
                for (int i = 0; i < 3; i++)
                    A[i][i] = 1;
        }

    int* operator[](const int i) {
        return A[i];
    }

    Matrix& operator*=(Matrix B)
    {
        int C[3][3];
        memcpy(C, A, sizeof(C));
        memset(A, 0, sizeof(A));

        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                for (int k = 0; k < 3; k++)
                    A[i][j] = (A[i][j] + 1LL * C[i][k] * B[k][j]) % MOD;

        return *this;
    }
private:
    int A[3][3];
};

Matrix Pow(Matrix x, int y)
{
    Matrix ret = 1;

    for (; y; y >>= 1)
    {
        if (y & 1) ret *= x;
        x *= x;
    }

    return ret;
}

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

    int T;
    scanf("%d", &T);

    while (T--)
    {
        int X, Y, Z, A, B, C, N;
        scanf("%d%d%d%d%d%d%d", &X, &Y, &Z, &A, &B, &C, &N);

        if (N == 0) printf("%d\n", X);
        else if (N == 1) printf("%d\n", Y);
        else if (N == 2) printf("%d\n", Z);
        else
        {
            Matrix Mat;

            Mat[0][0] = A;
            Mat[0][1] = B;
            Mat[0][2] = C;

            Mat[1][0] = Mat[2][1] = 1;

            Mat = Pow(Mat, N - 2);

            printf("%d\n", int((1LL * Z * Mat[0][0] + 1LL * Y * Mat[0][1] + 1LL * X * Mat[0][2]) % MOD));
        }
    }
}