Cod sursa(job #2763578)

Utilizator DordeDorde Matei Dorde Data 15 iulie 2021 12:13:19
Problema Iepuri Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <cstdio>
using namespace std;
int const Mod = 666013;
int A [4][4] , B [4][4] , r [4][4];
int t , x , y , z , a , b , c , n;
void matmul (int v1 [4][4] , int v2 [4][4]){
    int r2 [4][4];
    for(int i = 1 ; i <= 3 ; ++ i)
        for(int j = 1 ; j <= 3 ; ++ j)
            r2 [i][j] = 0;
    for(int i = 1 ; i <= 3 ; ++ i)
        for(int j = 1 ; j <= 3 ; ++ j)
            for(int k = 1 ; k <= 3 ; ++ k)
                r2 [i][j] = (1LL * v1 [i][k] * v2 [k][j] + r2 [i][j]) % Mod;
    for(int i = 1 ; i <= 3 ; ++ i)
        for(int j = 1 ; j <= 3 ; ++ j)
            v1 [i][j] = r2 [i][j];
    return;
}
void lgput (int v1 [4][4] , int x){
    int r2 [4][4] , c2 [4][4];
    for(int i = 1 ; i <= 3 ; ++ i)
        for(int j = 1 ; j <= 3 ; ++ j)
            r2 [i][j] = 0 , c2 [i][j] = v1 [i][j];
    r2 [1][1] = r2 [2][2] = r2 [3][3] = 1;
    for(int i = 0 ; (1 << i) <= x ; ++ i){
        if ((1 << i) & x)
            matmul (r2 , c2);
        matmul (c2 , c2);
    }
    for(int i = 1 ; i <= 3 ; ++ i)
        for(int j = 1 ; j <= 3 ; ++ j)
            v1 [i][j] = r2 [i][j];
    return;
}
int main()
{
    freopen ("iepuri.in" , "r" , stdin);
    freopen ("iepuri.out" , "w" , stdout);
    scanf ("%d" , &t);
    while (t --){
        scanf ("%d%d%d%d%d%d%d" , &x , &y , &z , &a , &b , &c , &n);
        A [1][1] = x , A [1][2] = y , A [1][3] = z;
        B [1][1] = 0 , B [1][2] = 0 , B [1][3] = c;
        B [2][1] = 1 , B [2][2] = 0 , B [2][3] = b;
        B [3][1] = 0 , B [3][2] = 1 , B [3][3] = a;
        lgput (B , (n - 2));
        matmul (A , B);
        printf ("%d\n" , A [1][3]);
    }
    return 0;
}