Cod sursa(job #2184729)

Utilizator seby97cojocariu sebastian seby97 Data 24 martie 2018 10:56:31
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <fstream>
//#include <string.h>

#define KMAX 3
#define MOD 666013

using namespace std;

void multiply_matrix(int A[KMAX][KMAX], int B[KMAX][KMAX], int C[KMAX][KMAX]) {
    int tmp[KMAX][KMAX];
 
    // tmp = A * B
    for (int i = 0; i < KMAX; ++i) {
        for (int j = 0; j < KMAX; ++j) {
            unsigned long long sum = 0; // presupun ca suma  incape pe 64 de biti
 
            for (int k = 0; k < KMAX; ++k) {
                sum += 1LL * A[i][k] * B[k][j];
            }
 
            tmp[i][j] = sum % MOD;
        }
    }
 
    //  C = tmp
    for(int i=0;i<KMAX;i++)
    	for(int j=0;j<KMAX;j++)
    		C[i][j] = tmp[i][j];
}

void power_matrix(int C[KMAX][KMAX], int p, int R[KMAX][KMAX]) {
    // tmp = I (matricea identitate)
    int tmp[KMAX][KMAX];
    for (int i = 0; i < KMAX; ++i) {
        for (int j = 0; j < KMAX; ++j) {
            tmp[i][j] = (i == j) ? 1 : 0;
        }
    }
 
    while (p != 1) {
        if  (p % 2 == 0) {
            multiply_matrix(C, C, C);     // C = C*C
            p /= 2;                       // ramane de calculat C^(p/2)
        } else {
            // reduc la cazul anterior:
            multiply_matrix(tmp, C, tmp); // tmp = tmp*C
            --p;                          // ramane de calculat C^(p-1)
        }
    }
 
    // avem o parte din rezultat in C si o parte in tmp
    multiply_matrix(C, tmp, R);           // rezultat = tmp * C
}
 

int iepuri(int x,int y,int z,int a,int b,int c,int n){
	if(n==0) return x;
	if(n==1) return y;
	if(n==2) return z;

	int matrix[3][3] = {{0,1,0},{0,0,1},{c,b,a}};
	int rezultat[3][3];
	power_matrix(matrix,n-2,rezultat);

	return (1LL*rezultat[2][0]*x%MOD + 1LL*rezultat[2][1]*y%MOD + 1LL*rezultat[2][2]*z%MOD)%MOD;

}

int main(){
	ifstream in("iepuri.in");
	ofstream out("iepuri.out");

	int nr_linii,x,y,z,a,b,c,n;
	in>>nr_linii;
	for(int i=0;i<nr_linii;i++){
		in>>x>>y>>z>>a>>b>>c>>n;
		out<<iepuri(x,y,z,a,b,c,n);
		if(i!=nr_linii-1)
			out<<endl;
	}
	
}