Cod sursa(job #1420782)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 18 aprilie 2015 22:36:36
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <iostream>
#include <vector>
   
#define MOD 666013
   
using namespace std;
using Matrix = vector<vector<int> >;
   
ifstream in("iepuri.in");
ofstream out("iepuri.out");
  
inline void multiply_matrix(Matrix &m1, Matrix &m2)
{
    Matrix res(m1.size(), vector<int>(m2.front().size(), 0));
    
    int l = m1.size();
    for (int i = 1; i < l; i++)
        for (int j = 1; j <= 3; j++)
            for (int k = 1; k <= 3; k++)
                res[i][j] = (res[i][j] + 1LL * m1[i][k] * m2[k][j]) % MOD;
   
    swap(m2, res);
}
  
inline void log_pow_matrix(Matrix &z, int power)
{
    Matrix res(z.size(), std::vector<int>(z.size(), 0));

    for (auto i = 1u; i < z.size(); i++) 
        res[i][i] = 1;
   
    for (auto i = 0u; (1 << i) <= power; i++) {
        if (power & (1 << i)) 
            multiply_matrix(z, res);
   
        multiply_matrix(z, z);
    }
   
    swap(res, z);
}
  
int main()
{
    int T;
    in >> T;
  
    int X, Y, Z, A, B, C, N;
    for (int test = 1; test <= T; test++) {
        in >> X >> Y >> Z >> A >> B >> C >> N;
  
        Matrix z(4, vector<int>(4, 0));
        z[1][3] = C; z[2][3] = B; z[3][3] = A;
        z[2][1] = 1; z[3][2] = 1;
          
        log_pow_matrix(z, N - 2);
  
        Matrix m1(2, vector<int>(4, 0));
        m1[1][1] = X; m1[1][2] = Y; m1[1][3] = Z;
  
        multiply_matrix(m1, z);
  
        out << z[1][3] << '\n';
    }
  
    return 0;
}