Cod sursa(job #1832323)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 19 decembrie 2016 19:48:45
Problema Al k-lea termen Fibonacci Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#include <string.h>
#define MOD 666013

long long A[2][2] = {{0, 1},
                     {1, 1}};

void Matrix_2D_Multiply(long long A[2][2], long long B[2][2]){

long long a, b, c, d;

a = (((A[0][0]%MOD)*(B[0][0]%MOD))%MOD + ((A[0][1]%MOD)*(B[1][0]%MOD))%MOD)%MOD;
b = (((A[0][0]%MOD)*(B[0][1]%MOD))%MOD + ((A[0][1]%MOD)*(B[1][1]%MOD))%MOD)%MOD;
c = (((A[1][0]%MOD)*(B[0][0]%MOD))%MOD + ((A[1][1]%MOD)*(B[1][0]%MOD))%MOD)%MOD;
d = (((A[1][0]%MOD)*(B[0][1]%MOD))%MOD + ((A[1][1]%MOD)*(B[1][1]%MOD))%MOD)%MOD;

A[0][0] = a;
A[0][1] = b;
A[1][0] = c;
A[1][1] = d;
}

long long Expo(long long A[2][2], long long b){

long long result[2][2] = {{1, 0},
                          {0, 1}};
while (b){

    if(b&1){
        Matrix_2D_Multiply(result, A);
    }
    b >>= 1;
    Matrix_2D_Multiply(A, A);
}
A[0][0] = result[0][0];
A[0][1] = result[0][1];
A[1][0] = result[1][0];
A[1][1] = result[1][1];
}

int main(){

FILE *file1, *file2;
long long i, j, K;

file1 = fopen("kfib.in", "r");
file2 = fopen("kfib.out", "w");

fscanf(file1, "%lld", &K);
Expo(A, K+1);
fprintf(file2, "%lld", A[0][0]);
return 0;
}