Cod sursa(job #1861844)

Utilizator Coroian_DavidCoroian David Coroian_David Data 29 ianuarie 2017 12:38:54
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <cstdio>

#define MOD 666013

using namespace std;

FILE *f, *g;

long long cm[5][5];
long long m[5][5];
long long c[5][5];

long long i[5][5];

long long n;
long long a, b, cc;
long long x, y, z;

long long ok;

void initM()
{
    cm[1][1] = 0;
    cm[1][2] = 1;
    cm[1][3] = 0;

    cm[2][1] = 0;
    cm[2][2] = 0;
    cm[2][3] = 1;

    cm[3][1] = cc;
    cm[3][2] = b;
    cm[3][3] = a;

    long long i, j;
    for(i = 1; i <= 3; i ++)
    {
        for(j = 1; j <= 3; j ++)
            m[i][j] = 0, c[i][j] = 0;//, printf("%d ", cm[i][j]);

        //printf("\n");
    }

    ok = 0;
}

void inmSquare(long long a[][5], long long b[][5], long long n, long long cod)
{
    long long i, j, k;

    //printf("+++++++++++%d\n", ok);

    if(ok == 0 && cod == 1)
    {
        for(i = 1; i <= n; i ++)
        {
            for(j = 1; j <= n; j ++)
                a[i][j] = b[i][j];
        }

        ok = 1;
    }

    else
    {
        for(i = 1; i <= n; i ++)
        {
            for(j = 1; j <= n; j ++)
            {
                c[i][j] = 0;
                for(k = 1; k <= n; k ++)
                {
                    c[i][j] += (a[i][k] * b[k][j] % MOD);
                    c[i][j] %= MOD;
                }
            }
        }

        for(i = 1; i <= n; i ++)
        {
            for(j = 1; j <= n; j ++)
            {
                a[i][j] = c[i][j];
            }
        }
    }
}

void scrie(long long a[][5])
{
    long long i, j;

    for(i = 1; i <= 3; i ++)
    {
        for(j = 1; j <= 3; j ++)
        {
            printf("*%lld ", a[i][j]);
        }

        printf("\n");
    }
}

void getMpowN()
{
    long long i;

    for(i = 0; (1LL << i) <= n; i ++)
    {
        if(((1LL << i) & n) != 0)
        {
           // scrie(m);
           // printf("*\n");
            //scrie(cm);
            //printf("=\n");

            inmSquare(m, cm, 3, 1);

            //scrie(m);
        }

        //printf("%d\n", (1 << i));

        inmSquare(cm, cm, 3, 2);
    }
}

long long rez;

void getRez()
{
   /* printf("\n%d %d %d\n", m[1][1], m[1][2], m[1][3]);
    printf("%d %d %d\n", m[2][1], m[2][2], m[2][3]);
    printf("%d %d %d\n", m[3][1], m[3][2], m[3][3]);
    printf("\n");

    printf("%d %d %d\n", cm[1][1], cm[1][2], cm[1][3]);
    printf("%d %d %d\n", cm[2][1], cm[2][2], cm[2][3]);
    printf("%d %d %d\n", cm[3][1], cm[3][2], cm[3][3]);
    printf("\n");*/

    rez = m[1][1] * x + m[1][2] * y + m[1][3] * z;

    fprintf(g, "%lld\n", rez);
}

void solve()
{
    getMpowN();

    getRez();
}

void readFile()
{
    f = fopen("iepurasi.in", "r");
    g = fopen("iepurasi.out", "w");

    long long t;
    fscanf(f, "%lld", &t);

    long long i;
    for(i = 1; i <= t; i ++)
    {
        fscanf(f, "%lld%lld%lld", &x, &y, &z);
        fscanf(f, "%lld%lld%lld", &a, &b, &cc);
        fscanf(f, "%lld", &n);

        initM();

        solve();
    }

    fclose(f);
    fclose(g);
}

int main()
{
    readFile();

    return 0;
}