Cod sursa(job #1862735)

Utilizator blackmanta45Andrei blackmanta45 Data 30 ianuarie 2017 10:58:08
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");
long long A[4][4],B[4][4],C[4][4],D[4][4],t,nr,p,k,i,j,x,y,z,a,b,c,n,s;

int init () {
    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;
    memcpy(B,A,sizeof(A));
}

int inmultire () {
    for(i=1;i<=3;i++)
        for(j=1;j<=3;j++)
            for(k=1;k<=3;k++){
                C[i][j]+=A[i][k]*B[k][j]%666013;
                C[i][j]%=666013;
            }
}

int init2 () {
    D[1][1]=1;
    D[1][2]=0;
    D[1][3]=0;
    D[2][1]=0;
    D[2][2]=1;
    D[2][3]=0;
    D[3][1]=0;
    D[3][2]=0;
    D[3][3]=1;
}

int reset () {
    C[1][1]=0;
    C[1][2]=0;
    C[1][3]=0;
    C[2][1]=0;
    C[2][2]=0;
    C[2][3]=0;
    C[3][1]=0;
    C[3][2]=0;
    C[3][3]=0;
}

int main () {
    fin>>nr;
    for(s=1;s<=nr;s++){
        fin>>x>>y>>z>>a>>b>>c>>t;
        init();
        reset();
        init2();
        t-=2;
        while(t>0){
            p=1;
            if(t==1){
                memcpy(A,D,sizeof(D));
                inmultire();
                t--;
                memcpy(D,C,sizeof(C));
            }
            else{
                while(p*2<=t){
                    reset();
                    inmultire();
                    memcpy(A,C,sizeof(C));
                    memcpy(B,C,sizeof(C));
                    p*=2;
                }
                t-=p;
                memcpy(A,C,sizeof(C));
                memcpy(B,D,sizeof(C));
                reset();
                inmultire();
                memcpy(D,C,sizeof(C));
                reset();
                init();
            }
        }
        memcpy(A,D,sizeof(C));
        reset();
        B[1][1]=z,B[2][1]=y,B[3][1]=x;
        for(i=1;i<=3;i++)
            for(k=1;k<=3;k++){
                C[i][1]+=A[i][k]*B[k][1]%666013;
                C[i][1]%=666013;
            }
        C[1][1]%=666013;
        fout<<C[1][1]<<"\n";
        init();
        init2();
        reset();
    }
}