Cod sursa(job #2791242)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 30 octombrie 2021 11:44:06
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>

#define MOD 666013

int start[3][3], crt[3][3], rez[3][3], factor[3][3];

void multMat( int a[3][3], int b[3][3], int m, int n, int p ) {
    int l, c, i;

    for ( l = 0; l < m; l++ ) {
        for ( c = 0; c < p; c++ )
            rez[l][c] = 0;
    }
    for ( l = 0; l < m; l++ ) {
        for ( c = 0; c < p; c++ ) {
            for ( i = 0; i < n; i++ )
                rez[l][c] = (rez[l][c] + ((long long)a[l][i] * b[i][c]) % MOD) % MOD;
        }
    }
}

void lgPut( int n ) {
    int l, c;

    if ( n == 1 ) {
        for ( l = 0; l < 3; l++ ) {
            for ( c = 0; c < 3; c++ )
                crt[l][c] = factor[l][c];
        }
    } else {
        lgPut( n / 2 );

        multMat( crt, crt, 3, 3, 3 );
        for ( l = 0; l < 3; l++ ) {
            for ( c = 0; c < 3; c++ )
                crt[l][c] = rez[l][c];
        }

        if ( n % 2 == 1 ) {
            multMat( crt, factor, 3, 3, 3 );
            for ( l = 0; l < 3; l++ ) {
                for ( c = 0; c < 3; c++ )
                    crt[l][c] = rez[l][c];
            }
        }
    }
}

int main() {
    FILE *fin, *fout;
    int t, n, x, y, z, a, b, c;

    fin = fopen( "iepuri.in", "r" );
    fscanf( fin, "%d", &t );

    fout = fopen( "iepuri.out", "w" );

    while ( t-- ) {
        fscanf( fin, "%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n );

        factor[0][2] = c;
        factor[1][0] = 1;
        factor[1][2] = b;
        factor[2][1] = 1;
        factor[2][2] = a;
        lgPut( n );

        start[0][0] = x;
        start[0][1] = y;
        start[0][2] = z;
        multMat( start, crt, 3, 3, 3 );

        fprintf( fout, "%d\n", rez[0][0] );
    }

    fclose( fin );
    fclose( fout );

    return 0;
}