Cod sursa(job #3299661)

Utilizator Tuduce_RobertTuduce Robert Florin Tuduce_Robert Data 9 iunie 2025 02:10:57
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>

void inmultire(long long a[2][2], long long b[2][2],long long mod) {
    long long c[2][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;

    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
            a[i][j] = c[i][j];
}

void ridicare_rapida(long long mat[2][2], long long k,long long mod) {
    long long rezultat[2][2] = {{1, 0}, {0, 1}};
    long long baza[2][2] = {
        {mat[0][0], mat[0][1]},
        {mat[1][0], mat[1][1]}
    };

    while(k > 0) {
        if(k % 2 == 1)
            inmultire(rezultat, baza, mod);
        inmultire(baza, baza,mod);
        k /= 2;
    }

    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
            mat[i][j] = rezultat[i][j];
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("kfib.in","r");
    fout = fopen("kfib.out","w");
    long long k;
    long long mod = 666013;
    long long Z[2][2] = {{0,1},{1,1}};
    fscanf(fin,"%lld",&k);
    if(k==0)
        fprintf(fout,"%d",0);
    else
    {
        if(k == 2 || k == 1)
            fprintf(fout,"%d",1);
        else
            ridicare_rapida(Z,k,mod);
    }
    fprintf(fout,"%lld",Z[0][1]);
    fclose(fin);
    fclose(fout);
}