Cod sursa(job #2080919)

Utilizator VoineaAndreiVoinea Ioan-Andrei VoineaAndrei Data 3 decembrie 2017 17:34:10
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<bits/stdc++.h>
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

//constanta la care se imparte
const long long r=666013;

//functia care inmulteste 2 matrici
void imultire_matrici(long long v[3][3],long long w[3][3]){
    long long a[3][3];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            a[i][j]=(v[i][0]*w[0][j])%r+(v[i][1]*w[1][j])%r+(v[i][2]*w[2][j])%r;

    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            v[i][j]=a[i][j]%r;
}

//ridicare la putere logaritmica pe matrici
void lgputM(long long v[3][3],int p){


    if(p!=1){   //cand p este 1, se termina recursivitatea

    //retinem valoarile din matricea v, intr-o matrice secundara
    //pentru cazul in care puterea este impara
    long long a[3][3];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            a[i][j]=v[i][j];

    //ridicam matricea la patrat
    imultire_matrici(v,v);

    //ridicarea la putrere logaritmica
    if(p%2==0) lgput(v,p/2); //daca puterea e para
    else{               // daca puterea este impara
        lgput(v,(p-1)/2);
        imultire_matrici(v,a);
    }
    }

}

//functia care returneaza cati iepuri sunt in ziua N
long long iepuri(){
    long long x,y,z,a,b,c;
    int n;
    f>>x>>y>>z>>a>>b>>c>>n;

    //matricea ce contine constantele a,b,c
    long long v[3][3]={a, b, c, 1, 0, 0, 0, 1, 0};
    //matricea ce contine x,y,z
    long long k[3][3]={z, 0, 0, y, 0, 0, x, 0, 0};
    //pentru a obtine cati iepuri sunt in ziua N
    //ridicam la puterea n-2, matricea cu constante
    //si apoi inmultim cu matricea x,y,z a zilelor
    lgput(v,n-2);
    imultire_matrici(v,k);

    //primul element din matricea finala va fi numarul de iepuri dupa N zile
    return v[0][0];
}
int main(){
    int t;f>>t;
    //chemam fiecare funtie pentru fiecare linie din datele de intrare
    for(int i=1;i<=t;i++)
        g<<iepuri()<<'\n';
}