Cod sursa(job #2157732)

Utilizator EclipseTepes Alexandru Eclipse Data 9 martie 2018 20:54:51
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define MOD 666013

using namespace std;

unsigned int k;
unsigned int fibMatrix[3][3], solutionMatrix[3][3];

ifstream fin("kfib.in");
ofstream fout("kfib.out");

void MultiplyMatrix(unsigned int A[3][3], unsigned int B[3][3], unsigned int C[3][3]) {
    unsigned int i, j, k;
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
            for (k = 0; k < 2; k++) {
                C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j]) % MOD;
            }
        }
    }
}

void LogarithmicPower(unsigned int power, unsigned int matrix[3][3]) {
    unsigned int C[3][3], temp[3][3], i;
    memcpy(C, fibMatrix, sizeof(fibMatrix));
    matrix[0][0] = matrix[1][1] = 1;
    for (i = 0; (1 << i) <= power; i++) {
        if (power & (1 << i)) {
            memset(temp, 0, sizeof(temp));
            MultiplyMatrix(matrix, C, temp);
            memcpy(matrix, temp, sizeof(temp));
        }
        memset(temp, 0, sizeof(temp));
        MultiplyMatrix(C, C, temp);
        memcpy(C, temp, sizeof(C));
    }
}

int main()
{
    fin >> k;
    fibMatrix[0][0] = 0;
    fibMatrix[0][1] = 1;
    fibMatrix[1][0] = 1;
    fibMatrix[1][1] = 1;
    LogarithmicPower(k - 1, solutionMatrix);
    fout << solutionMatrix[1][1];
    return 0;
}