Cod sursa(job #1740679)

Utilizator mariusn01Marius Nicoli mariusn01 Data 12 august 2016 00:14:33
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
// t0 = x; t1 = y; t2 = z;
// tn = a*tn-1+b*tn-2+c*tn-3
// relatie de recurenta (exponentiere de metrice)
#include <fstream>
#define MOD 666013

using namespace std;

long long t, n;
long long a[3][3], r[3][3], aux[3][3], X, Y, Z, A, B, C, N;

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

void copiere(long long a[3][3], long long b[3][3]) {
    for (int i=0;i<=2;i++)
        for (int j=0; j<=2; j++)
            a[i][j] = b[i][j];
}

void setid(long long a[3][3]) {
    for (int i=0;i<=2;i++)
        for (int j=0; j<=2; j++)
            if (i == j)
                a[i][j] = 1;
            else
                a[i][j] = 0;
}

void setinit(long long x[3][3], long long a, long long b, long long c) {
    x[0][0] = a; x[0][1] = b; x[0][2] = c;
    x[1][0] = 1; x[1][1] = 0; x[1][2] = 0;
    x[2][0] = 0; x[2][1] = 1; x[2][2] = 0;
}

int main() {

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

    for (fin>>t;t--;) {
        fin>>X>>Y>>Z>>A>>B>>C>>N;
        setid(r);
        setinit(a, A, B, C);
        int b = N-2;
        while (b) {
            if (b%2 == 1) {
                inmultire(r, a, aux);
                copiere(r, aux);
            }
            inmultire(a, a, aux);
            copiere(a, aux);

            b/=2;
        }
        fout<<(r[0][0]*Z + r[0][1]*Y + r[0][2]*X) % MOD<<"\n";
    }

    return 0;
}