Cod sursa(job #3158192)

Utilizator sebigabiSebastian Itu sebigabi Data 17 octombrie 2023 22:35:18
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <fstream>
#define ull unsigned long long
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");


//3x3
//3x1
//3x1

void inmulteste(ull a[][3], ull b[][3])
{
    int i,j,k;
    ull c[3][3]={{0,0,0},
                 {0,0,0},
                 {0,0,0}};
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            for(k=0; k<3; k++)
            {
                a[i][k] %= 666013;
                b[k][j] %= 666013;
                c[i][j] += a[i][k] * b[k][j] % 666013;
                c[i][j] %= 666013;
            }
        }
    }
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            a[i][j] = c[i][j] % 666013;
        }
    }
}

void inm(ull a[][3], ull b[][1])
{
    int i,j,k;
    ull c[3][1]={{0},
                 {0},
                 {0}};
    for(i=0; i<3; i++)//n
    {
        for(j=0; j<1; j++)//p
        {
            for(k=0; k<3; k++)//m
            {
                a[i][k] %= 666013;
                b[k][j] %= 666013;
                c[i][j] += a[i][k] * b[k][j] % 666013;
                c[i][j] %= 666013;
            }
        }
    }
    for(i=0; i<3; i++)//n
    {
        for(j=0; j<1; j++)//p
        {
            b[i][j] = c[i][j] % 666013;
        }
    }
}

void afiseaza(int mat[][1])
{
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<1; j++)
        {
            out<<mat[i][j]<<" ";
        }
        out<<"\n";
    }
    out<<"\n";
}

int main()
{
    int t,x,y,z,a,b,c,n;
    in>>t;
    for(int i=1; i<=t; i++)
    {
        in>>x>>y>>z>>a>>b>>c>>n;
        ull p[3][3]={{0,1,0},
                     {0,0,1},
                     {c,b,a}};
        ull mat[3][3]={{0,1,0},
                       {0,0,1},
                       {c,b,a}};
        ull mat2[3][1]={{x},
                        {y},
                        {z}};

        //mat1 ^ (n-3) * mat2
        n=n-3;
        while(n>0)
        {
            if(n%2==1)
            {
                inmulteste(p,mat);
            }
            inmulteste(mat,mat);
            n/=2;
        }
        inm(p,mat2);
        //afiseaza(mat2);
        out<<mat2[2][0]<<"\n";
    }
    return 0;
}