Cod sursa(job #1743)

Utilizator varuvasiTofan Vasile varuvasi Data 14 decembrie 2006 17:44:22
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <string.h>
#define M 666013

int N, X, Y, Z, A, B, C;
long long rez[4][4], power[4][4];
int nrb = 0;

FILE *fout;

void Mul(long long A[4][4], long long B[4][4], long long C[4][4])
{
    long long a[4][4];
    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 3; j++)
        {
            long long s = 0;
            for (int k = 1; k <= 3; k++)
            {
                s += (B[i][k] * C[k][j]) % M;
                s %= M;
            }    
            a[i][j] = s % M;
        }
    memcpy(A, a, sizeof(a));
}

int main()
{
    FILE *fin = fopen("iepuri.in", "rt");
    fout = fopen("iepuri.out", "wt");
    int T = 0;
    fscanf(fin, "%d", &T);
    while (T)
    {
    T--;
    nrb = 0;
    fscanf(fin, "%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C, &N);
    
    power[1][2] = power[2][3] = 1; power[1][1] = power[1][3] = power[2][1] = power[2][2] = 0;
    power[3][1] = C; power[3][2] = B; power[3][3] = A;
    
    for (int bit = 0; bit < 32; bit++)
    {
        if (N & (1 << bit))
        {
            if (nrb == 0)
                memcpy(rez, power, sizeof(power)), nrb++;
            else
            {
                Mul(rez, rez, power);
                nrb++;
            }    
        }
        Mul(power, power, power);
    }
    
    int In = ((rez[1][1]% M) * X + (rez[1][2] % M) * Y + (rez[1][3] % M) * Z)% M;
    fprintf(fout, "%d\n", In);
    
    }    
    fclose(fin);
    fclose(fin);
    
    return 0;
}