Cod sursa(job #1145735)

Utilizator teoionescuIonescu Teodor teoionescu Data 18 martie 2014 13:33:31
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
const int MOD = 666013;
int T,X,Y,Z,A,B,C,N;
struct mat{
    int a[5][5];
    mat(){
        memset(a,0,sizeof(a));
    }
    mat(int t){
        a[1][1]= 1,a[1][2]= 0,a[1][3]= 0;
        a[2][1]= 0,a[2][2]= 1,a[2][3]= 0;
        a[3][1]= 0,a[3][2]= 0,a[3][3]= 1;
    }
    mat(int _a,int _b,int _c){
        a[1][1]=_a,a[1][2]=_b,a[1][3]=_c;
        a[2][1]= 1,a[2][2]= 0,a[2][3]= 0;
        a[3][1]= 0,a[3][2]= 1,a[3][3]= 0;
    }
    mat operator * (mat P){
        mat S;
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                for(int k=1;k<=3;k++){
                    S.a[i][j]+=(1LL*a[i][k]*P.a[k][j])%MOD;
                }
            }
        }
        return S;
    }
    void print(){for(int i=1;i<=3;i++){for(int j=1;j<=3;j++)out<<a[i][j]<<' ';out<<'\n';}}
};
mat pow(mat b,unsigned int e){
    mat S=mat(0);
    for(int i=0;(1<<i)<=e;i++){
        if(e&(1<<i)){
            S=S*b;
        }
        b=b*b;
    }
    return S;
}
int main(){
    in>>T;
    for(;T;--T){
        in>>X>>Y>>Z;
        in>>A>>B>>C;
        in>>N;
        mat R=pow(mat(A,B,C),N-2);
        int Ans=( (1LL*R.a[1][1]*Z)%MOD + (1LL*R.a[1][2]*Y)%MOD + (1LL*R.a[1][3]*X)%MOD )%MOD;
        out<<Ans<<'\n';
    }
    return 0;
}