Cod sursa(job #2130022)

Utilizator tanasaradutanasaradu tanasaradu Data 13 februarie 2018 13:08:10
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");
const int Mod = 666013;
const short var = 3;
int a[var + 2][var + 2] , v[var + 2][var + 2] , Q , X , Y , Z , A , B , C , nrz;
/**
  f[i] = a * f[i - 1] + b * f[i - 2] + c * f[i - 3]
  Solutia : exponentiere rapida pe matrice
  Complexitate : O(logn)
*/
inline void R(int aux[var + 2][var + 2])
{
    for(int i = 1 ; i <= var ; i++)
        for(int j = 1 ; j <= var ; j++)
            aux[i][j] = 0;
}
inline void COPY(int aux[var + 2][var + 2] , int aux1[var + 2][var + 2])
{
    for(int i = 1 ; i <= var ; i++)
        for(int j = 1 ; j <= var ; j++)
            aux[i][j] = aux1[i][j];
}
inline void Inmult(int aux[var + 2][var + 2] , int aux1[var + 2][var + 2])
{
    int c[var + 2][var + 2];
    long long s;
    for(int i = 1 ; i <= var ; i++)
        for(int j = 1 ; j <= var ; j++)
    {
        s = 0;
        for(int k = 1 ; k <= var ; k++)
            s += (1LL * aux[i][k] * aux1[k][j]);
        c[i][j] = s % Mod;
    }
    COPY(aux , c);
}
inline void LGPUT(int n)
{
    int unit[var + 2][var + 2];
    R(unit);
    unit[1][1] = unit[2][2] = unit[3][3] = 1;  /// matricea unitate -> u * v = v
    while(n > 0)
    {
        if(n % 2 == 1)
            Inmult(unit , v);
        n /= 2;
        Inmult(v , v);
    }
    COPY(v , unit);
}
inline void Read_Solve()
{
    fin >> Q;
    while(Q -- )
    {
        fin >> X >> Y >> Z >> A >> B >> C >> nrz;
        R(a);
        R(v);
        v[2][1] = v[var][2] = 1;
        v[1][var] = C;
        v[2][var] = B;
        v[3][var] = A;
        a[1][1] = X;
        a[1][2] = Y;
        a[1][3] = Z;
        LGPUT(nrz - 2);
        Inmult(a , v);
        fout << a[1][var] << "\n";
    }
}
int main()
{
    Read_Solve();
    fin.close();
    fout.close();
    return 0;
}