Cod sursa(job #804749)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 30 octombrie 2012 12:18:36
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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;
            while(a[i][j] < 0)
                a[i][j] += 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%MOD;
        mat[2][1] = b%MOD;
        mat[2][2] = a%MOD;

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

    //for(i=0; i<3; i++) {
    //    for(j=0; j<3; j++)
    //        out<<mat[i][j]<<' ';
    //    out<<'\n';
    //}
    a = ((mat[0][0]%MOD * x)%MOD + (mat[0][1]%MOD * y)%MOD + (mat[0][2]%MOD * z)%MOD)%MOD;
        out<<a<<"\n";
    }
}