Cod sursa(job #682253)

Utilizator psycho21rAbabab psycho21r Data 18 februarie 2012 19:41:00
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#define MOD 666013
using namespace std;
void mult(long long a[3][3], long long b[3][3])
{
    int aux[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            for(int k = 0; k < 3; ++k)
                aux[i][j] += ((a[i][k]*b[k][j])%MOD);
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            a[i][j] = aux[i][j];
}
int iepuri(int X, int Y, int Z, int A, int B, int C, int N)
{
    long long sol[3][3] = {{1,0,0},{0,1,0},{0,0,1}}, x[3][3] = {{0,1,0},{0,0,1},{C,B,A}};
    for(unsigned long long i = 0; (1<<i) <= N-2; ++i)
    {
        if(((1<<i)&(N-2)) > 0)
            mult(sol, x);
        mult(x,x);
    }
    int res[3] = {0,0,0}, timeres[3] = {X,Y,Z};
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            res[i] += ((sol[i][j]*timeres[j])%MOD);
    return res[2];
}
int main()
{
    int T;
    ifstream in("iepuri.in");
    in >> T;
    ofstream out("iepuri.out");
    for(int X,Y,Z,A,B,C,N;T;--T)
    {
        in >> X >> Y >> Z >> A >> B >> C >> N;
        out << iepuri(X,Y,Z,A,B,C,N) << "\n";
    }
    in.close();
    out.close();
    return 0;
}