Cod sursa(job #2263649)

Utilizator marcogoldPop Mihali Marco Silviu marcogold Data 18 octombrie 2018 22:48:23
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;

ofstream fo("iepuri.out");
ifstream fi("iepuri.in");


struct matrix
{
    int a[4][4],l;
};

int n,t,x1,x2,x3,a,b,c;

matrix operator * (matrix A,matrix B)
{
    matrix C;
    C.l=3;

    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            C.a[i][j]=0;

    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            for(int k=1; k<=3; k++)
                C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%MOD;

    return C;
}

matrix ridicare(matrix baza,int putere)
{
    matrix rezultat;

    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            rezultat.a[i][j]=0;

    for(int i=1; i<=3; i++)
        rezultat.a[i][i]=1;

    for(int i=1; i<(1<<30); i*=2)
    {
        if(putere & i)
        {
            rezultat=rezultat*baza;
        }
        baza=baza*baza;
    }



    return rezultat;
}

matrix T,F;

int main()
{
    fi>>t;


    T.l=3;

    for(int test=1; test<=t; test++)
    {

        for(int i=1; i<=3; i++)
            for(int j=1; j<=3; j++)
            {
                T.a[i][j]=0;
                F.a[i][j]=0;
            }


        for(int i=1; i<=3; i++)
            T.a[i][i+1]=1;

        fi>>x1>>x2>>x3>>a>>b>>c>>n;

        T.a[3][1]=c;
        T.a[3][2]=b;
        T.a[3][3]=a;

        F.a[1][1]=x1;
        F.a[2][1]=x2;
        F.a[3][1]=x3;


        T=ridicare(T,n-1);
        T=T*F;




        fo<<T.a[2][1]%MOD<<endl;
    }

    fo.close();
    fi.close();
    return 0;
}