Cod sursa(job #482164)

Utilizator CossAlbulescu Cosmina Coss Data 2 septembrie 2010 18:20:09
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
using namespace std;

#define MOD 666013

long long M[4][4], copie_m[4][4], I[4][2];
int bin[10001];
int n, i, j, k, t;
int x, y, z, a, b, c;
int l, p, dim;

void inmultire_M (long long a[4][4], long long b[4][4])
{
    long long c[4][4];
    for (i=1; i<=3; ++i)
        for (j=1; j<=3; ++j)
            c[i][j] = 0;

    for (i=1; i<=3; ++i)
        for (j=1; j<=3; ++j)
            for (k=1; k<=3; ++k)
                c[i][k] += (a[i][j] * b[j][k]) % MOD;

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

void afisare (long long mat[4][4])
{
    for (i=1; i<=3; ++i)
    {
        for (j=1; j<=3; ++j)
            printf ("%d ", mat[i][j]);
        printf ("\n");
    }
    printf ("\n");
}

void inmultire_I (long long a[4][4], long long b[4][2])
{
    long long c[4][2];
    for (i=1; i<=3; ++i)
        c[i][1] = 0;

    for (i=1; i<=3; ++i)
        for (j=1; j<=3; ++j)
            for (k=1; k<=1; ++k)
                c[i][k] += (a[i][j] * b[j][k]) % MOD;

    for (i=1; i<=3; ++i)
        b[i][1] = c[i][1];
}

int main ()
{
    FILE *f = fopen ("iepuri.in","r");
    FILE *g = fopen ("iepuri.out","w");
    fscanf (f,"%d", &t);

    for (p=1; p<=t; ++p)
    {
        fscanf (f,"%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &n);

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

        for (i=1; i<=3; ++i)
            for (j=1; j<=3; ++j)
                M[i][j] = 0;
        M[1][1] = M[2][2] = M[3][3] = 1;

        I[1][1] = x;
        I[2][1] = y;
        I[3][1] = z;

        dim = 0;
        while (n)
        {
            dim ++;
            bin[dim] = n % 2;
            n /= 2;
        }

        for (l=dim; l>=1; --l)
        {
            inmultire_M (M, M);
            if (bin[l])
                inmultire_M (M, copie_m);
        }

        //afisare (M);
        inmultire_I (M, I);

        fprintf (g, "%lld\n", I[1][1]);
    }


    fclose (g);
    fclose (f);
    return 0;
}