Cod sursa(job #1712352)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 2 iunie 2016 18:42:55
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <stdlib.h>
#define MOD 666013

long long M[3][3], fin[3][3];

inline void multiply(long long answer[3][3], long long M[3][3], long long N[3][3]){
    long long i, j, k;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++){
            answer[i][j]=0;
            for(k=0;k<3;k++)
                answer[i][j]+=M[i][k]*N[k][j];
            answer[i][j]%=MOD;
        }
}

inline void identity(long long M[3][3]){
    for(long long i=0;i<3;i++)
        M[i][i]=1;
}

inline void pow(long long answer[3][3], long long M[3][3], long long exp){
    long long tmp[3][3];
    identity(answer);
    while(exp>0){
        if(exp%2==1){
            multiply(tmp, answer, M);
            for(long long i=0;i<3;i++)
                for(long long j=0;j<3;j++)
                    answer[i][j]=tmp[i][j];
        }
        multiply(tmp, M, M);
        for(long long i=0;i<3;i++)
            for(long long j=0;j<3;j++)
                M[i][j]=tmp[i][j];
        exp/=2;
    }
}

int main(){
    int t;
    FILE*fi,*fo;
    fi=fopen("iepuri.in","r");
    fo=fopen("iepuri.out","w");
    fscanf(fi,"%d", &t);
    for(int i=1;i<=t;i++){
        int x, y, z, a, b, c, n;
        fscanf(fi,"%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n);
        for(int j=0;j<3;j++)
            for(int k=0;k<3;k++)
                fin[j][k]=0;
        M[0][0]=0;
        M[0][1]=1;
        M[0][2]=0;
        M[1][0]=0;
        M[1][1]=0;
        M[1][2]=1;
        M[2][0]=c;
        M[2][1]=b;
        M[2][2]=a;
        pow(fin, M, n);
        long long ans[3][3];
        long long P[3][3];
        P[0][0]=x;
        P[1][0]=y;
        P[2][0]=z;
        /*for(int j=0;j<3;j++){
            for(int k=0;k<3;k++)
                printf("%lld ", fin[j][k]);
            printf("\n");
        }*/
        multiply(ans, fin, P);
        fprintf(fo,"%lld\n", ans[0][0]);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}