Cod sursa(job #1002099)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 26 septembrie 2013 20:59:23
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#define INF 666013
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
int n,A,B,C,X,Y,Z,T;
long long a[3][3];

void mult(long long s[][3],long long p[][3],long long q[][3],int tip){
    for(register int i=0;i<3;i++){
        for(register int j=0;j<3;j++){
            for(register int k=0;k<3;k++){
                if(tip==2)
                    q[i][j]+=(s[i][k]*p[k][j])%INF,q[i][j]%=INF;
                else
                    q[i][j]+=(p[i][k]*p[k][j])%INF,q[i][j]%=INF;
            }
        }
    }
}

void copiere(long long s[][3],long long q[][3]){
    for(register int i=0;i<3;i++){
        for(register int j=0;j<3;j++){
            s[i][j]=q[i][j],q[i][j]=0;
        }
    }
}

void exp(long long b,long long a[][3]){
    long long p[3][3]={{0,0,0},{0,0,0},{0,0,0}},s[3][3]={{1,0,0},{0,1,0},{0,0,1}},q[3][3]={{0,0,0},{0,0,0},{0,0,0}};
    p[0][0]=a[0][0],p[0][1]=a[0][1],p[0][2]=a[0][2],p[1][0]=1,p[2][1]=1;
    while(b>0){
        if(b%2){
            mult(s,p,q,2);
            copiere(s,q);
        }
        mult(p,p,q,1);
        copiere(p,q);
        b/=2;
    }
    copiere(a,s);
}

int main(void){
    register int i;

    f>>T;
    for(;T>0;T--){
        f>>X>>Y>>Z>>A>>B>>C>>n;
        a[0][0]=A,a[0][1]=B,a[0][2]=C,a[1][0]=1,a[2][1]=1,a[1][2]=0,a[1][1]=0,a[2][0]=0,a[2][2]=0;
        exp(n-2,a);
        g<<((X*a[0][2])%INF+(Y*a[0][1])%INF+(Z*a[0][0])%INF)%INF<<"\n";
    }
    return 0;
}