Cod sursa(job #1139059)

Utilizator andreiagAndrei Galusca andreiag Data 10 martie 2014 20:47:11
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <iostream>
#include <string.h>

using namespace std;
typedef long long ll;
const int MOD = 666013;

ll a[3][3], b[3][3];

void mmult(ll A[3][3], ll B[3][3], ll res[3][3])
{
    ll tmp[3][3];
    memset(tmp, 0, sizeof(tmp));

    for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
    for (int k = 0; k < 3; k++)
        tmp[i][j] += A[i][k] * B[k][j];

    for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        res[i][j] = tmp[i][j] % MOD;
}

int main()
{
    int T,X,Y,Z,A,B,C,N;
    int *tmp_ptr;
    ifstream f ("iepuri.in");
    ofstream g ("iepuri.out");

    f >> T;
    for (int t = 0; t < T; t++) {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
    
        f >> X >> Y >> Z >> A >> B >> C >> N;
        
        a[0][0] = A; a[0][1] = B; a[0][2] = C;
        a[1][0] = 1;
                     a[2][1] = 1;

        b[0][0] = 1; b[1][1] = 1; b[2][2] = 1;

        N = N-2;
        while (N) {
            if (N%2 == 1) {
                mmult(b,a,b);
            }
            mmult(a,a,a);
            N /= 2;
        }
        ll ret = (b[0][0] * Z + b[0][1] * Y + b[0][2] * X) % MOD;
        g << ret << '\n';
    }
    return 0;
}