Cod sursa(job #804754)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 30 octombrie 2012 12:45:26
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <cstring>
#include <cassert>
#include <iostream>
using namespace std;

const long long MOD = 666013;

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

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

void mmult(long long a[3][3], long long b[3][3], long long c[3][3]) {
    static long long 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(long long m[3][3], long long mo[3][3], long long n) {
    static long long p[3][3], i, j;
    assert(n > 0);
    if(n == 1) 
        return;
    mpow(m, mo, n/2);
    mmult(p, m, m);
    if(n%2 == 1) {
        mmult(m, p, mo);
    } else {
        for(i=0; i<3; i++)
            for(j=0; j<3; j++)
                m[i][j] = p[i][j];
    }
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++)
            m[i][j] = m[i][j] % MOD;
    }
}

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);

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