Cod sursa(job #3227504)

Utilizator NadiraBodrogean Nadira Nadira Data 1 mai 2024 15:23:02
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
//https://infoarena.ro/problema/kfib
#include <fstream>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
long long result[2][1];
long long M[2][2];
#define Nmax  666013
long long inmultire(long long A[2][2],long long B[2][2])
{

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

    for( i = 0; i <= 1 ; i++)
        for( j = 0; j <= 1; j++)
            A[i][j] = C[i][j];
}
long long inmultire2(long long rez[2][1],long long A[2][2])
{
    long long C[2][1];
    int j=0,i,k;
    C[0][0]=C[0][1]=0;
    for( i = 0; i <=1; i++)
    {
        for(k = 0; k <= 1; k++)
            C[i][j]=( C[i][j]+ 1LL * A[i][k] * rez[k][j])%Nmax;
    }

    for(i = 0; i <= 1; i++)
        rez[i][j] = C[i][j];
}
int main(void)
{
    result[1][0]=1;
    M[0][0]=1;
    M[0][1]=1;
    M[1][0]=1;
    long long p;
    fin>>p;
    while(p)
    {
        if(p%2==1)
            inmultire2(result,M);
        inmultire(M,M);
        p=p/2;
    }
    fout<<result[0][0];
    return 0;
}