Cod sursa(job #2462610)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 27 septembrie 2019 17:37:00
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");
int a,b,c,i,j,ii,sol[5][5],suma,i2;
const int modu=666013;
void inmultire_matrici (int a1[5][5],int b[5][5])
{
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j)
		{
			suma=0;
			for(i2=1;i2<=3;++i2)
				suma=(suma+a1[i][i2]*b[i2][j])%666013;
			sol[i][j]=suma;
		}
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j)
			a1[i][j]=sol[i][j];
}
void build_matnull (int a1[5][5])
{
	for (i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            if(i==j)
                a1[i][j]=1;
            else
                a1[i][j]=0;
}
void build_a (int a1[5][5])
{
	a1[1][1]=a;a1[1][2]=b;a1[1][3]=c;
	for(i=2;i<=3;++i)
		for(j=1;j<=3;++j)
			if(j==i-1)
				a1[i][j]=1;
			else
				a1[i][j]=0;
}
void exponentiere_log (int matrice[5][5],int a1[5][5],int p)
{
	for(ii=0;p>0;++ii)
	{
		if((p & (1<<ii))!=0)
			p-=(1<<ii),inmultire_matrici(matrice,a1);
		inmultire_matrici(a1,a1);
	}
}
int main ()
{
	int t,x[5],n,mat1[5][5],mat2[5][5],ans;
	fin>>t;
	while(t--)
	{
		fin>>x[1]>>x[2]>>x[3]>>a>>b>>c>>n;++n;
		if(n-3==1)
		{
            ans=0;
            ans=ans+(a*x[3]+b*x[2]+c*x[1])%666013;
            fout<<ans<<"\n";
            continue;
		}
		build_matnull(mat1);build_a(mat2);ans=0;
		exponentiere_log(mat1,mat2,n-3);
		for(i=1;i<=3;++i)
			ans=(ans+(mat1[1][i]*x[4-i])%666013)%666013;
		fout<<ans<<"\n";
	}
	return 0;
}