Cod sursa(job #2719578)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 9 martie 2021 23:21:20
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <cstring>
#define mod 666013
using namespace std;
int m[4][4];
int aux[4][4];
int sol[4][4];
int i,j,n,k,q,a,b,c,x,y,z;

void copiere (int a[4][4], int b[4][4]) {
    for (int i=1;i<=3;i++) {
        for (int j=1;j<=3;j++) {
            a[i][j]=b[i][j];
        }
    }
}

void inmultire (int sol[4][4], int a[4][4], int b[4][4]) {
    for (int i=1;i<=3;i++) {
        for (int j=1;j<=3;j++) {
            sol[i][j]=0;
            for (int k=1;k<=3;k++) {
                sol[i][j]+=a[i][k]*b[k][j];
                sol[i][j]%=mod;
            }
        }
    }
}

int main() {
    ifstream fin("iepuri.in");
    ofstream fout("iepuri.out");
    for (fin>>q;q--;) {
        fin>>x>>y>>z>>a>>b>>c>>n;
        ///0=x
        ///1=y
        ///2=z
        ///3=z*a+y*b+x*c
        if (n==0) fout<<x<<"\n";
        else if (n==1) fout<<y<<"\n";
        else if (n==2) fout<<z<<"\n";
        else {
            memset(m,0,sizeof(m));
            memset(sol,0,sizeof(sol));
            m[1][2]=1;
            m[2][3]=1;
            m[3][1]=c;
            m[3][2]=b;
            m[3][3]=a;
            sol[1][1]=1;
            sol[2][2]=1;
            sol[3][3]=1;
            while (n) {
                if (n%2==1) {
                    copiere(aux,sol);
                    inmultire (sol,aux,m);
                }
                copiere(aux,m);
                inmultire(m,aux,aux);
                n/=2;
            }
            fout<<((1LL*x*sol[1][1]%mod+1LL*y*sol[1][2]%mod)%mod+1LL*z*sol[1][3]%mod)%mod<<"\n";
        }
    }
    return 0;
}