Cod sursa(job #2763580)

Utilizator DordeDorde Matei Dorde Data 15 iulie 2021 12:23:11
Problema Iepuri Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>

using namespace std;
int const Mod = 666013;
ifstream f ("iepuri.in");
ofstream g ("iepuri.out");
struct Mat{
    int v [4][4];
    Mat (){
        for(register int i = 1 ; i <= 3 ; ++ i)
            for(register int j = 1 ; j <= 3 ; ++ j)
                v [i][j] = 0;
    }
    Mat operator * (Mat X) const{
        Mat r;
        for(int i = 1 ; i <= 3 ; ++ i)
            for(register int j = 1 ; j <= 3 ; ++ j){
                int s = 0;
                for(register int k = 1 ; k <= 3 ; ++ k)
                    s = (1LL * s + 1LL * v [i][k] * X.v [k][j]) % Mod;
                r.v [i][j] = s;
            }
        return r;
    }
    Mat operator << (int x) const{
        Mat c = *this , r;
        r.v [1][1] = r.v [2][2] = r.v [3][3] = 1;
        for(register int i = 0 ; (1 << i) <= x ; ++ i){
            if ((1 << i) & x)
                r = r * c;
            c = c * c;
        }
        return r;
    }

}A , B;
int t , x , y , z , a , b , c , n;
void out (Mat X){
    for(register int i = 1 ; i <= 3 ; ++ i){
        for(register int j = 1 ; j <= 3 ; ++ j)
            g << X.v [i][j] << ' ';
        g << '\n';
    }
    g << '\n';
}
int const BUFF = 1e6;
char buff [BUFF];
int p = 0;
void getInt (int &x){
    x = 0;
    while (! isdigit (buff [p])){
        ++ p;
        if (p == BUFF)
            fread (buff , 1 , BUFF , stdin) , p = 0;
    }
    while (isdigit (buff [p])){
        x = x * 10 + (buff [p] - '0');
        ++ p;
        if (p == BUFF)
            fread (buff , 1 , BUFF , stdin) , p = 0;
    }
    return;
}
int main()
{
    freopen ("iepuri.in" , "r" , stdin);
    freopen ("iepuri.out" , "w" , stdout);
    fread (buff , 1 , BUFF , stdin);
    getInt (t);
    while (t --){
        getInt (x) , getInt (y) , getInt (z) , getInt (a) , getInt (b) , getInt (c) , getInt (n);
        Mat A , B;
        A.v [1][1] = x , A.v [1][2] = y , A.v [1][3] = z;
        B.v [1][1] = 0 , B.v [1][2] = 0 , B.v [1][3] = c;
        B.v [2][1] = 1 , B.v [2][2] = 0 , B.v [2][3] = b;
        B.v [3][1] = 0 , B.v [3][2] = 1 , B.v [3][3] = a;
        Mat r = (A * (B << (n - 2)));
        printf ("%d\n" , r.v [1][3]);
    }
    return 0;
}