Cod sursa(job #2811384)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 2 decembrie 2021 09:43:48
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)(((a)<(b))?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
ll t,x,y,z,a,b,c,n,sol;

struct w{
    long long mat[3][3];
} A,T;

w mult(w a,w b){
    w c;
    for(ll i=0;i<3;i++){
        for(ll j=0;j<3;j++){
            c.mat[i][j]=0;
            for(ll k=0;k<3;k++){
                c.mat[i][j]=(c.mat[i][j]+1LL*a.mat[i][k]*b.mat[k][j])%666013;
            }
        }
    }
    return c;
}

void solve(){

}

int main()
{
in>>t;
while(t--){
    in>>x>>y>>z>>a>>b>>c>>n;
    T.mat[0][0]=T.mat[0][2]=T.mat[1][0]=T.mat[1][1]=0;
    T.mat[0][1]=T.mat[1][2]=1;
    T.mat[2][0]=c;
    T.mat[2][1]=b;
    T.mat[2][2]=a;
    n-=2;
    for(ll i=0;i<3;i++){
        for(ll j=0;j<3;j++){
            if(i==j){
                A.mat[i][j]=1;
            }else{
                A.mat[i][j]=0;
            }
        }
    }
    while(n){
        if(n%2==0){
            n/=2;
            T=mult(T,T);
        }else{
            n--;
            A=mult(A,T);
        }
    }
    sol=((A.mat[2][0]*x)%666013 + (A.mat[2][1]*y)%666013 + (A.mat[2][2]*z)%666013)%666013;
    out<<sol<<'\n';
}
}