Cod sursa(job #3298620)

Utilizator florin977Docheru Florin-Andrei florin977 Data 31 mai 2025 18:52:03
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

#define MOD 666013

using namespace std;

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

vector<vector<uint64_t>> multiplyMatrix(vector<vector<uint64_t>> matrixA, vector<vector<uint64_t>> matrixB)
{
    int r1 = matrixA.size();
    int c1 = matrixA[0].size();
    int r2 = matrixB.size();
    int c2 = matrixB[0].size();


    vector<vector<uint64_t>> newMatrix(r1, vector<uint64_t>(c2, 0));

    if (c1 != r2)
    {
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < r1; i++)
    {
        for (int j = 0; j < c2; j++)
        {
            for (int k = 0; k < c1; k++)
            {
                newMatrix[i][j] = newMatrix[i][j] + matrixA[i][k] * matrixB[k][j];
                newMatrix[i][j] = newMatrix[i][j] % MOD;
            }
        }
    }

    return newMatrix;
}

void printMatrix(vector<vector<uint64_t>> matrix)
{
    for (long unsigned int i = 0; i < matrix.size(); i++, cout << '\n')
    {
        for (long unsigned int j = 0; j < matrix[0].size(); j++)
        {
            cout << matrix[i][j] << ' ';
        }
    }
}

vector<vector<uint64_t>> powMatrix(vector<vector<uint64_t>> matrix, uint64_t p)
{
    vector<vector<uint64_t>> resultMatrix(2, vector<uint64_t>(2, 0));

    if (p == 0)
    {
        resultMatrix[0][0] = resultMatrix[1][1] = 1;

        return matrix;
    }

    if (p == 1)
    {
        return matrix;
    }

    if ((p & 1) == 1)
    {
        p--;
        resultMatrix = powMatrix(matrix, p / 2);
        resultMatrix = multiplyMatrix(resultMatrix, resultMatrix);
        resultMatrix = multiplyMatrix(resultMatrix, matrix);

        return resultMatrix;
    }

    resultMatrix = powMatrix(matrix, p / 2);
    resultMatrix = multiplyMatrix(resultMatrix, resultMatrix);

    return resultMatrix;
}

int main()
{
    uint64_t k = 0;

    fin >> k;
    vector<vector<uint64_t>> fiboMatrix = {{0, 1}, {1, 1}};

    fiboMatrix = powMatrix(fiboMatrix, k);

    uint64_t result = fiboMatrix[0][1];

    fout << result << '\n';

    return 0;
}