Cod sursa(job #1420739)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 18 aprilie 2015 21:32:15
Problema Iepuri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 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++)
            if (i == j) res2[i][j] = 1;
            else 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]) % MOD + (Y * z[2][3]) % MOD + (Z * z[3][3]) % MOD) % MOD << '\n';
          
    }
  
    return 0;
}