Cod sursa(job #1420723)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 18 aprilie 2015 21:23:35
Problema Iepuri Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 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");

Matrix res1(4, vector<int>(4, 0));
Matrix res2(4, vector<int>(4, 0));

void multiply_matrix(Matrix &m1, Matrix &m2)
{
    for (auto i = 1u; i < m2.size(); i++)
        for (auto j = 1u; j < m2.size(); j++)
            res1[i][j] = 0;

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

    for (auto i = 1u; i < z.size(); i++) 
        res2[i][i] = 1;
  
    for (int i = 0; (1 << i) <= power; i++) {
        if (power & (1 << i)) 
            multiply_matrix(z, res2);
  
        multiply_matrix(z, z);
    }
  
    swap(res2, z);
}
 
int main()
{
 
    int T;
    in >> T;
 
    int X, Y, Z, A, B, C, N;
     
    Matrix z(4, vector<int>(4));
 
    for (int test = 1; test <= T; test++) {
        in >> X >> Y >> Z >> A >> B >> C >> N;
 
        for (int i = 1; i <= 3; i++)
            for (int j = 1; j <= 3; j++)
                z[i][j] = 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);
 
        out << (X * z[1][3] + Y * z[2][3] + Z * z[3][3]) % MOD << '\n';
         
    }
 
    return 0;
}