Cod sursa(job #1595700)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 10 februarie 2016 14:48:24
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <cstdio>
using namespace std;

FILE *in, *out;

const int mod = 666013;

int T;

/* CALCULEAZA a x b SI PUNE REZULTATUL IN a. FOLOSESTE c CA SPATIU DE MANEVRA */
void inm(long long a[3][3], long long b[3][3], long long c[3][3])
{
    int i, j, k;

    for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++)
        {
            c[i][j] = 0;

            for(k = 0; k < 3; k++)
                c[i][j] += a[i][k] * b[k][j];
        }

    for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++)
            a[i][j] = c[i][j] % mod;
}

void calcul()
{
    int I0, I1, I2;
    int A, B, C;
    int N;

    int i, j;

    fscanf(in, "%d %d %d", &I0, &I1, &I2);
    fscanf(in, "%d %d %d", &A, &B, &C);
    fscanf(in, "%d", &N);

    //CALCULAM M ^ N PRIN EXPONENTIERE LOGARITMICA

    long long M[3][3] = { {0,1,0}, {0,0,1}, {C,B,A} };

    long long ans[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} };

    long long rez[3][3];

    int k = N;

    while(k)
    {
        if(k % 2 == 1) inm(ans, M, rez);

        inm(M, M, rez);

        k = k/2;
    }

    int sol = ( ans[0][0] * I0 + ans[0][1] * I1 + ans[0][2] * I2 ) % mod;

    fprintf(out, "%d\n", sol);
}

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

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

    for(int i = 1; i <= T; i++) calcul();

    return 0;
}