Cod sursa(job #1802261)

Utilizator crazylamaRiclea Andrei crazylama Data 10 noiembrie 2016 00:05:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#define MAT 3
#define MOD 666013
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

long long int** inmultire_matrici(long long int** A, long long int** B)
{
    long long int **C = new long long int*[MAT];
    for (int i = 0; i < MAT; ++i)
    {
        C[i] = new long long int[MAT];
        for (int j = 0; j < MAT; ++j)
        {
            C[i][j] = 0;
            for (int ik = 0; ik < MAT; ++ik)
                C[i][j] += (A[i][ik] * 1LL * B[ik][j]) % MOD;
        }
    }
    return C;
}

long long int** ridica_la_putere(long long int** A, int n)
{
    if (n == 0)
        return A;
    if ((n - 1) % 2)
        return inmultire_matrici(A, ridica_la_putere(A, n - 1));
    long long int** B = ridica_la_putere(A, n / 2);
    return inmultire_matrici(B, B);
}

int main()
{
    int a, b, c, x, y, z, n, k;
    f >> k;
    for (int i = 0; i < k; ++i)
    {
        f >> x >> y >> z >> a >> b >> c >> n;
        long long int** A = new long long int*[MAT];
        long long int** B;
        for (int j = 0; j < MAT; ++j)
            A[j] = new long long int[MAT];
        A[0][0] = 0;
        A[0][1] = 0;
        A[1][1] = 0;
        A[2][0] = 0;
        A[0][2] = c;
        A[1][0] = A[2][1] = 1;
        A[1][2] = b;
        A[2][2] = a;
        B = ridica_la_putere(A, n - 3);
        int nr_iepuri = (((x * 1LL * B[0][2]) % MOD) + ((y * 1LL * B[1][2]) % MOD) + ((z * 1LL * B[2][2]) % MOD)) % MOD;
        g << nr_iepuri << "\n";
    }
    f.close();
    g.close();
    return 0;
}