Cod sursa(job #3298914)

Utilizator alexxsFilca Paul Alexandru alexxs Data 3 iunie 2025 01:29:00
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

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

int R[3][3],solutie[3][3];

void inmultire_matrice(int A[][3],int B[][3],int C[][3])
{
    int i,j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for (k = 0; k < 2; k++)
        C[i][j]=(C[i][j]+(1LL*A[i][k]*B[k][j]))% 666013;
}

void functie_logaritmica(int M[][3],int P)
{
    int C[3][3],temp[3][3];
    M[0][0]=M[1][1]=1;

    C[0][0]=0;
    C[0][1] = 1;
    C[1][0] = 1;
    C[1][1] = 1;
    while (P>0) {
        if (P%2==1) {
        for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            temp[i][j]=0;
            inmultire_matrice(M, C, temp);
            M[0][0] = temp[0][0];
            M[0][1] = temp[0][1];
            M[1][0] = temp[1][0];
            M[1][1] = temp[1][1];
        }
        for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            temp[i][j]=0;
        inmultire_matrice(C, C, temp);
        C[0][0] = temp[0][0];
        C[0][1] = temp[0][1];
        C[1][0] = temp[1][0];
        C[1][1] = temp[1][1];


        P /= 2;
    }

}

int main()
{
  int K;
  fin>>K;
  R[0][0]=0;
  R[0][1]=1;
  R[1][0]=1;
  R[1][1]=1;
  functie_logaritmica(solutie,K-1);
  fout<<solutie[1][1];
  fin.close();
  fout.close();
}