Cod sursa(job #2290836)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 27 noiembrie 2018 08:19:28
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
using namespace std;
ifstream in ("kfib.in");
ofstream out ("kfib.out");
int c[3][3],n;
const int mod = 666013;
int mat[3][3] = {{0,0,0},{0,1,1},{0,0,0}};
int aux[3][3] = {{0,0,0},{0,1,0},{0,0,1}};
int ini[3][3] = {{0,0,0},{0,0,1},{0,1,1}};
void inmultire (int a[3][3], int b[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] += (1LL* a[i][k] * b[k][j]) % mod;
            }
        }
    }
    for (int i = 1; i <= 2; i ++) {
        for (int j = 1; j <= 2; j ++) {
            a[i][j] = c[i][j] % mod;
        }
    }
}
void exponentiere (int n) {
    if (n/2 > 0) {
        exponentiere (n/2);
        inmultire(aux,aux);
    }
    if (n % 2 == 1) {
        inmultire (aux,ini);
    }
}

int main (void) {
    in >> n;

    //ridicam aux la n-2
    if (n > 2) {
        exponentiere (n-2);
        inmultire (mat,aux);
        out << mat[1][2];
    }
    else {
        if (n == 2 || n == 1) {
            out << 1;
        }
        else {
            out << 0;
        }
    }
    return 0;
}