Cod sursa(job #804524)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 29 octombrie 2012 21:56:16
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <cstring>
using namespace std;

const int MOD = 666013;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

int t,n,a,b,c,x,y,z,i,q,j;
int mat[3][3], mo[3][3];

void mmult(int a[][3], int b[][3], int c[][3]) {
    static int i, j, k;
    for(i=0; i<3; i++)
        for(j=0; j<3; j++) {
            a[i][j] = 0;
            for(k=0; k<3; k++)
                a[i][j] = (a[i][j] + (b[i][k] * c[k][j])%MOD)%MOD;
        }
}

void mpow(int m[][3], int mo[][3], int n) {
    static int p[3][3];
    if(n == 1) 
        return;
    mpow(m, mo, n/2);
    mmult(p, m, m);
    if(n%2 == 1) {
        mmult(m, p, mo);
    } else {
        memcpy(m, p, sizeof(m[0][0])*9);
    }
}

int main() {
    in>>t;
    while(t--) {
        in>>x>>y>>z>>a>>b>>c>>n;
        mat[0][0] = 0;
        mat[0][1] = 1;
        mat[0][2] = 0;

        mat[1][0] = 0;
        mat[1][1] = 0;
        mat[1][2] = 1;

        mat[2][0] = c;
        mat[2][1] = b;
        mat[2][2] = a;


        for(i=0; i<3; i++) {
            for(j=0; j<3; j++)
                mo[i][j] = mat[i][j];
        }
        mpow(mat, mo, n);

        a = ((mat[0][0] * x)%MOD + (mat[0][1] * y)%MOD + (mat[0][2] * z)%MOD)%MOD;
        out<<a<<'\n';
    }
}