Cod sursa(job #1596461)

Utilizator NicholasFlamelFasie Vlad George NicholasFlamel Data 11 februarie 2016 00:23:23
Problema Al k-lea termen Fibonacci Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>

#define M 666013

int v[4] = { 0, 1, 1, 1 };

void power(int n) {
    if(n!=1) {
        if(n%2) {
            n--;
            power(n/2);
            own_multiply();
            multiply();
        } else {
            power(n/2);
            own_multiply();
        }
    }
}

void own_multiply() {
    int aux[4];
    int i;
    for(i=0; i<4; i++) {
        aux[i] = v[i] % M;
    }
    v[0] = aux[0]*aux[0] + aux[1]*aux[2];
    v[1] = aux[0]*aux[1] + aux[1]*aux[3];
    v[2] = aux[2]*aux[0] + aux[3]*aux[2];
    v[3] = aux[2]*aux[1] + aux[3]*aux[3];
}

void multiply() {
    int aux[4];
    int i;
    for(i=0; i<4; i++) {
        aux[i] = v[i] % M;
    }
    v[0] = aux[1];
    v[1] = aux[0] + aux[1];
    v[2] = aux[3];
    v[3] = aux[2] + aux[3];
}

int main(void) {
    FILE *f;
    f = fopen("kfib.in", "r");
    if(f == NULL) {
        return 1;
    }
    int n;
    fscanf(f, "%d", &n);
    power(n-1);
    fclose(f);
    f = fopen("kfib.out", "w");
    if(f == NULL) {
        return 1;
    }
    fprintf(f, "%d\n", v[3]%M);
    fclose(f);
    return 0;
}