Cod sursa(job #3135268)

Utilizator maraboneaMara Bonea marabonea Data 2 iunie 2023 14:59:21
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <stdlib.h>

#define mod 666013

FILE *fin = NULL;
FILE *fout = NULL;

int k;
int baza[3][3], sol[3][3];

void inmult_matr(int a[3][3], int b[3][3])
{
    long long int c[3][3];
    for(int i = 1; i <= 2; i++)
    {
        for(int j = 1; j <= 2; j++)
        {
            c[i][j] = 0;
        }
    }
    for(int i = 1; i <= 2; i++)
    {
        for(int j = 1; j <= 2; j++)
        {
            for(int k = 1; k <= 2; k++)
            {
                c[i][j] = (c[i][j] + (long long)(a[i][k]) * (long long)(b[k][j])) % mod;
            }
        }
    }
    for(int  i = 1; i <= 2; i++)
    {
        for(int j = 1; j <= 2; j++)
        {
            a[i][j] = c[i][j];
        }
    }
}

void lgput()
{
    sol[1][1] = sol[2][2] = 1;
    baza[1][1] = baza[1][2] = baza[2][1] = 1;
    baza[2][2] = 0;
    
    while(k)
    {
        if(k % 2)
        {
            inmult_matr(sol, baza);
        }
        inmult_matr(baza, baza);
        k = k / 2;
    }
    if((fout = fopen("kfib.out", "w")) == NULL)
    {
        exit(-1);
    }
    fprintf(fout, "%d", sol[1][1]%mod);
    fclose(fout);
}

int main(void)
{
    if((fin = fopen("kfib.in", "r")) == NULL)
    {
        exit(-1);
    }
    fscanf(fin, "%d", &k);
    fclose(fin);
    k--;
    lgput();
    return 0;
}