Pagini recente » Istoria paginii runda/testare_olimpiada/clasament | Cod sursa (job #2844091) | Cod sursa (job #1545331) | Cod sursa (job #1749247) | Cod sursa (job #3290717)
#include <cstdio>
#include <string.h>
// Definim constanta pentru modul (pentru a preveni depășirea limitelor numerice)
const int modul = 666013;
// Variabilele necesare pentru recurență și calcule
int x, y, z, a, b, c, n;
long long p[4][4], sol[4][4], temp[4][4]; // Matrici pentru calculul puterilor
void produs(long long v1[4][4], long long v2[4][4], long long v3[4][4])
{
int i, j, k;
for (i=1; i<=3; ++i)
for (j=1; j<=3; ++j)
for (k=1; k<=3; ++k)
{
v3[i][j] += (v1[i][k] % modul) * (v2[k][j] % modul);
v3[i][j] %= modul; // Aplicăm modulo pentru a evita overflow
}
}
void solve()
{
int k;
memset(p, 0, sizeof(p)); // Inițializăm matricea de tranziție cu 0
memset(sol, 0, sizeof(sol)); // Inițializăm matricea identitate
// Construim matricea de tranziție
p[1][2] = p[2][3] = 1;
p[3][1] = c;
p[3][2] = b;
p[3][3] = a;
// Inițializăm matricea soluție ca matricea identitate
sol[1][1] = sol[2][2] = sol[3][3] = 1;
// Aplicăm exponentierea rapidă a matricii p la puterea (n-3)
for (k=0; k<32; k++) // Parcurgem fiecare bit al lui n
{
if ((n >> k) & 1) // Dacă bitul curent este 1
{
memset(temp, 0, sizeof(temp)); // Inițializăm matricea temporară
produs(p, sol, temp); // Înmulțim p cu sol și stocăm în temp
memcpy(sol, temp, sizeof(temp)); // Copiem rezultatul în sol
}
memset(temp, 0, sizeof(temp));
produs(p, p, temp); // Ridicăm matricea p la pătrat
memcpy(p, temp, sizeof(p)); // Copiem rezultatul în p
}
// Calculăm termenul T_n utilizând matricea rezultată
int afis = (x * sol[1][1] + y * sol[1][2] + z * sol[1][3]) % modul;
printf("%d\n", afis); // Afișăm rezultatul final
}
void citire()
{
int i, t;
scanf("%d\n", &t); // Citim numărul de teste
for (i=1; i<=t; ++i) // Iterăm prin fiecare test
{
scanf("%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &n);
solve(); // Calculăm și afișăm rezultatul pentru testul curent
}
}
int main()
{
freopen("iepuri.in", "r", stdin);
freopen("iepuri.out", "w", stdout);
citire();
return 0;
}