Cod sursa(job #1668588)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 29 martie 2016 21:31:40
Problema Al k-lea termen Fibonacci Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#include <stdlib.h>

#define MOD 666013
long long F[2][2]={{1,1},{1,0}};
long long fib(int n){
    if(n==0)
        return 0;
    power(n-1);
    return F[0][0];
}

void power(int n){
    if( n != 0 && n != 1){
        long long M[2][2] = {{1,1},{1,0}};
        power(n/2);
        multiply(F);
        if(n%2!=0)
            multiply(M);
    }
}

void multiply(long long M[2][2]){
    long long x, y, z, w;
    x =  (F[0][0]*M[0][0] + F[0][1]*M[1][0])%MOD;
    y =  (F[0][0]*M[0][1] + F[0][1]*M[1][1])%MOD;
    z =  (F[1][0]*M[0][0] + F[1][1]*M[1][0])%MOD;
    w =  (F[1][0]*M[0][1] + F[1][1]*M[1][1])%MOD;
    F[0][0] = x;
    F[0][1] = y;
    F[1][0] = z;
    F[1][1] = w;
}

int main()
{
    int k;
    FILE*fi,*fo;
    fi=fopen("kfib.in","r");
    fo=fopen("kfib.out","w");
    fscanf(fi,"%d", &k);
    fprintf(fo,"%lld", fib(k));

    fclose(fi);
    fclose(fo);
    return 0;
}