Cod sursa(job #3243242)

Utilizator AnaMateiAna Matei AnaMatei Data 16 septembrie 2024 18:06:54
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

int const mod=666013;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

void inmultireMatOrd3(unsigned long long mat1[][3], unsigned long long mat2[][3])
{
    unsigned long long rez[3][3]= {0};
    int i, j, k;
    for(i=0; i<3; i++)
        for(j=0; j<3; j++)
            for(k=0; k<3; k++)
                rez[i][j]=rez[i][j]+mat1[i][k]*mat2[k][j]%mod;
    for(i=0; i<3; i++)
        for(j=0; j<3; j++)
            mat1[i][j]=rez[i][j]%mod;
}


void expLogMatTriFibo(unsigned long long matTriFibo[][3], unsigned long long exp)
{
    unsigned long long rez[3][3]= {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
    int i, j;
    while(exp>0)
    {
        if(exp%2==1)
            inmultireMatOrd3(rez, matTriFibo);
        inmultireMatOrd3(matTriFibo, matTriFibo);
        exp/=2;
    }
    for(i=0; i<3; i++)
        for(j=0; j<3; j++)
            matTriFibo[i][j]=rez[i][j];
}

unsigned long long inmultireMatOrd3Ord13(unsigned long long matTriFibo[][3], int xyz[][1])
{
    int i, j;
    unsigned long long rez=0;
    for(j=0; j<3; j++)
        rez=rez+matTriFibo[0][j]*xyz[j][0];
    return rez%mod;
}

int main()
{
    int t, i, j, k, x, y, z, a, b, c, n, xyz[3][1];
    unsigned long long matTriFibo[3][3];
    f>>t;
    for(k=1; k<=t; k++)
    {
        f>>x>>y>>z>>a>>b>>c>>n;
        matTriFibo[0][0]=a;
        matTriFibo[0][1]=b;
        matTriFibo[0][2]=c;
        for(i=1; i<3; i++)
            for(j=0; j<3; j++)
                matTriFibo[i][j]=0;
        matTriFibo[1][0]=1;
        matTriFibo[2][1]=1;
        xyz[0][0]=z;
        xyz[1][0]=y;
        xyz[2][0]=x;
        expLogMatTriFibo(matTriFibo, n-2);
        g<<inmultireMatOrd3Ord13(matTriFibo, xyz)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}