Cod sursa(job #2072332)

Utilizator karakter98Irimia Robert karakter98 Data 21 noiembrie 2017 19:05:21
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
using namespace std;

FILE* fin;
FILE* fout;
int T, x, y, z, a, b, c;
unsigned long long n;

void multiply_matrix(unsigned long long A[3][3], unsigned long long B[3][3])
{
    unsigned long long C[3][3];
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            unsigned long long sum = 0;
            for (int k = 0; k < 3; ++k)
            {
                sum = sum + A[i][k] * B[k][j];
            }
            C[i][j] = sum;
        }
    }
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            A[i][j] = C[i][j] % 666013;
}

void raiseTo(unsigned long long A[3][3], unsigned long long p)
{
    int i;
    for(i = 2; i <= p; i *= 2)
        multiply_matrix(A, A);

    i /= 2;

    if(i < p)
    {
        unsigned long long B[3][3] = {{a, b, c}, {1, 0, 0}, {0, 1, 0}};
        raiseTo(B, p - i);
        multiply_matrix(A, B);
    }
}

int main()
{
    fin = fopen("iepuri.in", "r");
    fout = fopen("iepuri.out", "w");

    fscanf(fin, "%d", &T);

    for(int k = 0; k < T; ++k)
    {
        fscanf(fin, "%d %d %d %d %d %d %llu", &x, &y, &z, &a, &b, &c, &n);
        unsigned long long A[3][3] = {{a, b, c}, {1, 0, 0}, {0, 1, 0}};

        raiseTo(A, n - 2);

        fprintf(fout, "%llu\n", (A[0][0] * z + A[0][1] * y + A[0][2] * x) % 666013);
    }
    return 0;
}