Cod sursa(job #2130025)

Utilizator stefanst77Luca Stefan Ioan stefanst77 Data 13 februarie 2018 13:10:41
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>
#define modulo 666013

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

/**
    X -> ziua 0
    Y -> ziua 1
    Z -> ziua 2
    ziua n -> A * ziua(n - 1) + B * ziua(n - 2) + C * ziua(n - 3)

    INITIAL:
        (X Y Z)     (0 0 C)
    a = (0 0 0) v = (1 0 B)
        (0 0 0)     (0 1 A)

    rez = a * (v ^ (n - 2))

    ziua n -> rez[1][3]
*/

int t, n, X, Y, Z, A, B, C;
int a[7][7], v[7][7];

inline void Reset(int mat[7][7])
{
    int i, j;
    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++)
            mat[i][j] = 0;
}

inline void Inmultire(int x[7][7], int y[7][7])
{
    int aux[7][7], i, j, k;
    long long s;

    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++)
        {
            s = 0;
            for (k = 1; k <= 3; k++)
                s += 1LL * x[i][k] * y[k][j];
            aux[i][j] = s % modulo;
        }
    /// copiem
    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++)
            x[i][j] = aux[i][j];
}

void MatricePutere(int n)
{
    int aux[7][7], i, j;
    Reset(aux);
    aux[1][1] = 1;
    aux[2][2] = 1;
    aux[3][3] = 1;
    /// matricea unitate
    while (n > 0)
    {
        if (n % 2)
            Inmultire(aux, v);
        Inmultire(v, v);
        n /= 2;
    }
    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++)
            v[i][j] = aux[i][j];
}
/**
void Afisare(int x[7][7])
{   /// trebuie sa iasa ceva rau, deci verificam... ca doar mna... de ce nu?
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
            cout << x[i][j] << " ";
        cout << "\n";
    }
}
//*/
void Citire()
{
    fin >> t;
    while (t--)
    {
        fin >> X >> Y >> Z;
        fin >> A >> B >> C;
        fin >> n;
        /// initializari
        Reset(a);
        Reset(v);
        v[2][1] = v[3][2] = 1;
        v[1][3] = C;
        v[2][3] = B;
        v[3][3] = A;
        a[1][1] = X;
        a[1][2] = Y;
        a[1][3] = Z;
        ///rezolvare
        MatricePutere(n - 2);
        Inmultire(a, v);
        /// raspuns
        fout << a[1][3] << "\n";
    }
}

int main()
{
    Citire();
    fin.close();
    fout.close();
    return 0;
}