Cod sursa(job #1112653)

Utilizator rares96cheseliRares Cheseli rares96cheseli Data 19 februarie 2014 22:11:10
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <cstring>
#define mod 666013
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");

int X, Y, Z, A, B, C, N, M[4][4], t;

void inmultire(int a[][4], int b[][4], int c[][4])
{
    int aux[4][4]; memset(aux, 0, sizeof(aux));
    for (int i=1; i<=3; ++i)
        for (int j=1; j<=3; ++j)
        {
            long long sum=0;
            for (int k=1; k<=3; ++k)
                sum+=(1LL*a[i][k]*b[k][j])%mod;
            aux[i][j]=(sum%mod);
        }
    memcpy(c, aux, sizeof(aux));
}

void log_pow(int M[][4], int K)
{
    int res[4][4]; memset(res, 0, sizeof(res));
    res[1][1]=res[2][2]=res[3][3]=1;
    while (K)
    {
        if (K%2) inmultire(res, M, res);
        inmultire(M, M, M); K/=2;
    }
    memcpy(M, res, sizeof(res));
}

int main()
{
    f>>t;
    while (t--)
     {
        f>>X>>Y>>Z>>A>>B>>C>>N;
        M[1][1]=A; M[1][2]=1; M[1][3]=0;
        M[2][1]=B; M[2][2]=0; M[2][3]=1;
        M[3][1]=C; M[3][2]=0; M[3][3]=0;
        log_pow(M, N-2);
        g<<(1LL*Z*M[1][1]+1LL*Y*M[2][1]+1LL*X*M[3][1])%mod<<'\n';
     }
    return 0;
}