Cod sursa(job #3298954)

Utilizator abel3324Ursu Abel-Patrick abel3324 Data 3 iunie 2025 15:16:01
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#define MOD 666013

typedef struct{
    uint64_t a,b,c,d;
}matrix;

matrix multiply_and_modulo(matrix A,matrix B)
{
    matrix R;
    R.a=(A.a*B.a+A.b*B.c)%MOD;
    R.b=(A.a*B.b+A.b*B.d)%MOD;
    R.c=(A.c*B.a+A.d*B.c)%MOD;
    R.d=(A.c*B.b+A.d*B.d)%MOD;
    return R;
}
matrix power(matrix base,uint64_t exp)//exp rpd
{
    matrix res={1,0,0,1};//I2
    while(exp>0)
    {
        if(exp%2)
        {
            res=multiply_and_modulo(res,base);
        }
        base=multiply_and_modulo(base,base);
        exp/=2;
    }
    return res;
}

int main(void)
{
    FILE *fin=fopen("kfib.in","r");
    FILE *fout=fopen("kfib.out","w");
    if(fin==NULL || fout==NULL)
    {
        fprintf(stderr,"eroare la deschiderea fisierelor");
        exit(EXIT_FAILURE);
    }
    uint64_t k;
    if((fscanf(fin,"%lu",&k))!=1)
    {
        fprintf(stderr,"eroare la citirea din fisier");
        exit(EXIT_FAILURE);
    }
    if(k==0)
    {
        fprintf(fout,"0\n");
    }
    else
    {
        matrix m={0,1,1,1};
        matrix mk=power(m,k-1);
        fprintf(fout,"%lu\n",mk.d);
    }
   
    if((fclose(fin))!=0)
    {
        fprintf(stderr,"eroare la inchiderea fisierului de citire");
        exit(EXIT_FAILURE);
    }
    if((fclose(fout))!=0)
    {
        fprintf(stderr,"eroare la inchiderea fisierului de scriere");
        exit(EXIT_FAILURE);
    }
    return 0;
}