Cod sursa(job #1420792)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 18 aprilie 2015 23:03:51
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 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");
  
void multiply_matrix(Matrix &m1, Matrix &m2)
{
    Matrix res(m1.size(), vector<int>(m2.front().size(), 0));

    for (auto i = 0u; i < m1.size(); i++)
        for (int j = 0; j < 3; j++)
            for (int k = 0; k < 3; k++)
                res[i][j] = (res[i][j] + 1LL * m1[i][k] * m2[k][j]) % MOD;
   
    swap(m2, res);
}
  
void log_pow_matrix(Matrix &z, unsigned int power)
{
    Matrix res(z.size(), std::vector<int>(z.size(), 0));

    for (auto i = 0u; i < z.size(); i++) 
        res[i][i] = 1;
   
    for (auto i = 0u; (unsigned int)(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(3, vector<int>(3, 0));
        z[0][2] = C; z[1][2] = B; z[2][2] = A;
        z[1][0] = 1; z[2][1] = 1;
          
        log_pow_matrix(z, N - 2);
  
        Matrix m1(1, vector<int>(3, 0));
        m1[0][0] = X; m1[0][1] = Y; m1[0][2] = Z;
  
        multiply_matrix(m1, z);
  
        out << z[0][2] << '\n';
    }
  
    return 0;
}