Cod sursa(job #2855531)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 22 februarie 2022 16:08:08
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <cstring>
#include <climits>
#include <iomanip>
#include <stack>

#define MOD 666013
#define NMAX 4003
using namespace std;

int n;
int matriceInd[3][3],matConst[3][3];
int matriceInmult[3][3];

ifstream fin("expozitie.in");
ofstream fout("expozitie.out");


void inmultireMatrici(int a[][3],int b[][3],int rez[][3])
{
   int rez[3][3];
   //initializarile
   for(int i=0; i<=2; i++)
   {
       for(int j=0; j<=2; j++)
       {
           rez[i][j]=0;
       }
   }
   for(int lin=1; lin<=2; lin++)
   {
       //linia din a
       //inmultesc cu coloanele din b
       for(int col=1; col<=2; col++)
       {
           for(int k=1; k<=2; k++)
           {
               rez[lin][col]+=1LL*(a[lin][k]*b[k][col])%MOD;
           }

       }
   }
   return rez;
}

void putere(int k)
{
    matriceInd[1][1]=0;
    matriceInd[1][2]=1;
    matriceInd[2][1]=1;
    matriceInd[2][2]=1;

    matConst[1][1]=0;
    matConst[1][2]=1;
    matConst[2][1]=1;
    matConst[2][2]=1;
    while(k>0)
    {
        if(k%2==1)
        {
            matriceInmult=inmultireMatrici(matriceInmult,matriceStart);
        }
        matriceStart=inmultireMatrici(matriceStart,matConst);
        k=k/2;
    }
}

int main()
{
    fin>>n;
    putere(n-1);
    fout<<matriceInmult[1][2]+matriceInmult[2][2];
    return 0;
}