Cod sursa(job #3294808)

Utilizator RobertMM05Molcomis Robert-Marian RobertMM05 Data 28 aprilie 2025 19:51:28
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <string.h>

#define MOD 666013

void printMatrix(long long a[][2]) {
    printf("\n");
    for (long long i = 0; i < 2; i++) {
        for (long long j = 0; j < 2; j++) {
            printf("%lld ", a[i][j]);
        }
        printf("\n");
    }
}

void inmultire(long long a[][2], long long b[][2], long long c[][2]) {
    c[0][0] = (a[0][0] * b[0][0] + a[0][1] * b[1][0]) % MOD;
    c[0][1] = (a[0][0] * b[0][1] + a[0][1] * b[1][1]) % MOD;
    c[1][0] = (a[1][0] * b[0][0] + a[1][1] * b[1][0]) % MOD;
    c[1][1] = (a[1][0] * b[0][1] + a[1][1] * b[1][1]) % MOD;
}

long long fibo(int p) {
    long long a[2][2] = {{0, 1}, {1, 1}}, rez[2][2] = {{1, 0}, {0, 1}};
    long long temp[2][2];

    while(p) {
        if(p % 2 == 1) {
            inmultire(rez, a, temp);
            memcpy(rez, temp, sizeof(temp));
        }

        inmultire(a, a, temp);
        memcpy(a, temp, sizeof(temp));
        //printMatrix(a);

        p /= 2;
    }

    return rez[1][1];
}

int main() {
    FILE *input = fopen("kfib.in", "r");
    FILE *output = fopen("kfib.out", "w");

    int k;

    fscanf(input, "%d", &k);
    fprintf(output, "%lld\n", fibo(k - 1));
    
    fclose(input);
    fclose(output);

    return 0;
}