Cod sursa(job #2194887)

Utilizator alexge50alexX AleX alexge50 Data 14 aprilie 2018 15:54:58
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>

struct mat3
{
    long long m[3][3];

    mat3()
    {
        for(int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++) m[i][j] = 0;
    }

    mat3(long long a, long long b, long long c, long long d, long long e, long long f, long long g, long long h, long long i)
    {
        m[0][0] = a;
        m[0][1] = b;
        m[0][2] = c;
        m[1][0] = d;
        m[1][1] = e;
        m[1][2] = f;
        m[2][0] = g;
        m[2][1] = h;
        m[2][2] = i;
    }
};

mat3 ModMultiply(mat3 a, mat3 b, long long mod)
{
    mat3 c;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            long long sum = 0;
            for (int k = 0; k < 3; k++)
                sum = sum + a.m[i][k] * b.m[k][j];
            c.m[i][j] = sum % mod;
        }
    }

    return c;
}

const int MOD = 666013;

mat3 pow(mat3 b, int n)
{
    if(n == 1)
        return b;

    mat3 a = pow(b, n / 2);
    mat3 c = ModMultiply(a, a, MOD);

    if(n % 2 == 1)
        c = ModMultiply(c, b, MOD);

    return c;
}

int main()
{
    FILE *fin = fopen("iepuri.in", "r"),
         *fout = fopen("iepuri.out", "w");
    int t;
    int x, y, z;
    int a, b, c;
    int n;

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

        mat3 days(x, y, z, 0, 0, 0, 0, 0, 0);
        mat3 multiplier(0, 0, c,
                        1, 0, b,
                        0, 1, a);

        multiplier = pow(multiplier, n);
        days = ModMultiply(days, multiplier, MOD);

        fprintf(fout, "%lld\n", days.m[0][0]);
    }

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