Cod sursa(job #3030056)

Utilizator andreibrosPeta Andrei Mathias andreibros Data 17 martie 2023 14:33:09
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
int v[3];
const int MOD=666013;


void inmultire(long long x[3][3], long long y[3][3], long long z[3][3])
{
    for(int i=0; i<3; i++)
    {

        for(int j=0; j<3; j++)
        {
            z[i][j]=0;
            for(int k=0; k<3; k++)
            {
                z[i][j]=(z[i][j]+(x[i][k]*y[k][j])%MOD)%MOD;
            }

        }
    }
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            x[i][j]=z[i][j];
        }
}

int main()
{
    int t;
    int a,b,d,n;
    in>>t;
    long long mat[3][3], ans[3][3], c[3][3];
    for(int i=1; i<=t; i++)
    {
        in>>v[2]>>v[1]>>v[0]>>a>>b>>d>>n;
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                mat[i][j]=0;
        mat[0][0]=a;
        mat[0][1]=b;
        mat[0][2]=d;
        mat[1][0]=1;
        mat[2][1]=1;

        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                ans[i][j]=0;
        ans[0][0]=ans[1][1]=ans[2][2]=1;


        n=n-2;
        while(n)
        {

            if(n%2==1)
            {
                inmultire(ans,mat,c);

            }
            inmultire(mat,mat,c);
            n=n/2;
        }



        long long rez=(ans[0][0]*v[0]%MOD+ans[0][1]*v[1]%MOD+ans[0][2]*v[2]%MOD)%MOD;
        out<<rez<<'\n';
    }
    return 0;
}