Cod sursa(job #805202)

Utilizator BalcauIonutFMI-Balcau Ionut BalcauIonut Data 30 octombrie 2012 23:15:15
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

long long x,y,z,a1,b1,c1,n,t;


void mult(long long a[3][3],long long b[3][3], long long c[3][3]){
    long long i,j,k;

    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            a[i][j]=0;

    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            for(k=0;k<3;++k)
            a[i][j]+=b[i][k]*c[k][j];
}

void set(long long a[3][3], long long c[3][3]){
    long long i,j;
    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            a[i][j]=c[i][j];
}


long long solve(){
    long long a[3][3],b[3][3],c[3][3];
    a[0][0]=0; a[0][1]=0; a[0][2]=c1;
    a[1][0]=1; a[1][1]=0; a[1][2]=b1;
    a[2][0]=0; a[2][1]=1; a[2][2]=a1;

    memset(c,0,sizeof(c));
    c[0][0]=1; c[1][1]=1; c[2][2]=1;

    long long p=n-2,i;

    for(i=0; (1<<i)<=p; ++i){
       if( (1<<i) & p ){
            mult(b,c,a);
            set(c,b);
       }
       mult(b,a,a);
       set(a,b);
    }

    return (x*c[0][2]+y*c[1][2]+z*c[2][2])%666013;

}
int main(){
    ifstream fin("iepuri.in");
    ofstream fout("iepuri.out");
    fin>>t;
    for(long long i=1;i<=t;++i){
        fin>>x>>y>>z>>a1>>b1>>c1>>n;
        fout<<solve()<<'\n';
    }
    return 0;
}