Cod sursa(job #2927423)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 20 octombrie 2022 14:50:23
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>

using namespace std;
FILE *fin, *fout;

const int NMAX = 10;
const int MOD = 666013;

int C[NMAX][NMAX];

void copy_matrix(int dest[NMAX][NMAX], int src[NMAX][NMAX], int ord)
{
    for(int i = 1; i <= ord; i++)
        for(int j = 1; j <= ord; j++)
            dest[i][j] = src[i][j];
}

void matrix_product(int A[NMAX][NMAX], int B[NMAX][NMAX], int C[NMAX][NMAX], int ord)
{
    int AUX[NMAX][NMAX] = {0};
    for(int i = 1; i <= ord; i++)
        for(int j = 1; j <= ord; j++)
            for(int k = 1; k <= ord; k++)
                AUX[i][j] = ((0LL + AUX[i][j] + ((1LL * (A[i][k] % MOD) * (B[k][j] % MOD)) % MOD)) % MOD);
    copy_matrix(C, AUX, ord);
}

void matrix_lgput(int A[NMAX][NMAX], int B[NMAX][NMAX], int ord, int exp)
{
    int AUX[NMAX][NMAX];

    copy_matrix(AUX, A, ord);

    if(exp == 1 or exp == 0)
    {
        copy_matrix(B, A, ord);
        return;
    }

    if(exp % 2 == 1)
    {
        matrix_lgput(A, AUX, ord, exp - 1);

        matrix_product(A, AUX, B, ord);
    }
    else
    {
        matrix_lgput(A, AUX, ord, exp / 2);

        matrix_product(AUX, AUX, B, ord);
    }
}

void print_matrix(int ord)
{
    for(int i = 1; i <= ord; i++)
    {
        for(int j = 1; j <= ord; j++)
            fprintf(fout, "%d ", C[i][j]);

        fprintf(fout, "\n");
    }
}

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

    int D[NMAX][NMAX] , F[NMAX][NMAX];
    D[1][1] = 0;
    D[1][2] = 0;
    D[2][1] = 1;
    D[2][2] = 0;
    D[3][1] = 0;
    D[3][2] = 1;

    int t;
    fscanf(fin, "%d", &t);

    int x1, x2, x3, a, b, c, n;

    for(int test = 1; test <= t; test++)
    {
        fscanf(fin, "%d%d%d%d%d%d%d", &x1, &x2, &x3, &a, &b, &c, &n);

        D[1][3] = c;
        D[2][3] = b;
        D[3][3] = a;

        matrix_lgput(D, C, 3, n - 2);

        for(int i = 1; i <= 3; i++)
        {
            F[i][1] = x1;
            F[i][2] = x2;
            F[i][3] = x3;
        }

        matrix_product(F , C , C , 3);
        //print_matrix(3);

        fprintf(fout, "%d\n", C[3][3]);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}