Cod sursa(job #1794044)

Utilizator d0rina2011Craciun Dorina d0rina2011 Data 31 octombrie 2016 20:33:49
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>

using namespace std;

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

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

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

long long a[3][3], i3[3][3], t[3][3];

void ridicare(long long a[3][3], long long n){
    int i,j;
    if(n){
        if(n % 2 == 1){
            inmultire(i3, a, t);
            copiere(i3, t);
            ridicare(a, n-1);
        } else {
            inmultire(a, a, t);
            copiere(a, t);
            ridicare(a, n/2);
        }
    }
}

int main()
{
    long long T, X, Y, Z, A, B, C, N, i, j, ii, aux;
    fin>>T;
    for (ii = 1; ii <= T; ++ii){
        fin>>X>>Y>>Z>>A>>B>>C>>N;
        N -= 2;
        a[0][0] = A;
        a[0][1] = B;
        a[0][2] = C;
        a[1][0] = 1;
        a[1][1] = 0;
        a[1][2] = 0;
        a[2][0] = 0;
        a[2][1] = 1;
        a[2][2] = 0;
        i3[0][0] = 1;
        i3[0][1] = 0;
        i3[0][2] = 0;
        i3[1][0] = 0;
        i3[1][1] = 1;
        i3[1][2] = 0;
        i3[2][0] = 0;
        i3[2][1] = 0;
        i3[2][2] = 1;
        while (N > 0) {
            if (N % 2 == 1) {
                inmultire(i3, a, t);
                copiere(i3, t);
            }
            inmultire(a, a, t);
            copiere(a, t);
            N /= 2;
        }
        fout<<(i3[0][0] * Z + i3[0][1] * Y + i3[0][2] * X) % MOD<<"\n";
    }
    return 0;
}