Cod sursa(job #3357330)

Utilizator Cosma_Laura_IoanaCosma Laura-Ioana Cosma_Laura_Ioana Data 8 iunie 2026 21:35:30
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#define MOD 666013

// structura pentru matrice
typedef struct {
    long long mat[2][2];
} Matrice;

// Matricea constanta Z = (0 1;
//                         1 1)
// Folosesc proprietatea: Z^k = (F_k-1 F_k;
//                               F_k F_k+1)

// inmultirea matricilor
Matrice inmultire(Matrice A, Matrice B)
{
    Matrice C;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            C.mat[i][j] = 0;
            for (int k = 0; k < 2; k++)
            {
                C.mat[i][j] = (C.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % MOD;
            }
        }
    }
    return C;
}

// ridicarea la putere a matricilor
Matrice putere(Matrice baza, long long exp)
{
    Matrice rezultat = {{{1, 0},{0, 1}}}; // matricea identitate

    // ridicarea la putere in timp logaritmic
    while (exp > 0)
    {
        if (exp % 2 == 1)
        {
            rezultat = inmultire(rezultat, baza);
        }
        baza = inmultire(baza, baza);
        exp = exp/2;
    }
    return rezultat;
}

int main(void)
{
    FILE *fin = fopen("kfib.in", "r");
    if (fin == NULL)
    {
        printf("eroare deschidere fisier intrare\n");
        return 1;
    }

    FILE *fout = fopen("kfib.out", "w");
    if (fout == NULL)
    {
        printf("eroare deschidere fisier iesire\n");
        return 1;
    }

    long long K;
    fscanf(fin, "%lld", &K);

    if (K == 0)
        fprintf(fout, "0\n");
    else
    {
        Matrice Z = {{{0, 1},{1, 1}}}; // matricea constanta

        Matrice rezultat_final = putere(Z, K); // Z^K

        // F_k e pe pozitia [0][1] sau [1][0]
        fprintf(fout, "%lld\n", rezultat_final.mat[0][1]);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}