Cod sursa(job #1738)

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

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

FILE *fout;

void Mul(int A[4][4], int B[4][4], int C[4][4])
{
    int a[4][4];
    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 3; j++)
        {
            int s = 0;
            for (int k = 1; k <= 3; k++)
                s += (B[i][k] * C[k][j]) % 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] * X + rez[1][2] * Y + rez[1][3] * Z) % M;
    fprintf(fout, "%d\n", In);
    
    }    
    fclose(fin);
    fclose(fin);
    
    return 0;
}