Cod sursa(job #2189621)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 28 martie 2018 18:58:53
Problema Al k-lea termen Fibonacci Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>

std::ifstream in("kfib.in");
std::ofstream out("kfib.out");

const int MOD = 666013;
const int MAT_SIZE = 2;

class Matrix {
    int mat[MAT_SIZE][MAT_SIZE];
public:
    Matrix() {
        for (int i = 0; i < MAT_SIZE; i++)
            for (int j = 0; j < MAT_SIZE; j++)
                mat[i][j] = 0;
    }

    void setElement(int row, int col, int val) {
        mat[row][col] = val;
    }

    int getElement(int row, int col) {
        return mat[row][col];
    }

    friend Matrix operator * (const Matrix& a, const Matrix& b) {
        Matrix result;
        for (int i = 0; i < MAT_SIZE; i++)
            for (int j = 0; j < MAT_SIZE; j++)
                for (int k = 0; k < MAT_SIZE; k++)
                    result.mat[i][j] = (result.mat[i][j] + 1LL * a.mat[i][k] * b.mat[k][j]) % MOD;
        return result;
    }

    friend Matrix operator *= (Matrix& a, const Matrix& b) {
        Matrix result = a * b;
        a = result;
        return a;
    }

    friend Matrix operator ^ (const Matrix& a, int p) {
        Matrix result = Matrix::Identity();
        Matrix mat = a;

        for (; p; p >>= 1) {
            if (p & 1)
                result *= mat;
            mat *= mat;
        }

        return result;
    }


    static Matrix Identity() {
        Matrix m;
        for (int i = 0; i < MAT_SIZE; i++)
            m.mat[i][i] = 1;
        return m;
    }
};

int main() {
    int k;
    in >> k;

    Matrix mat;
    mat.setElement(0, 1, 1);
    mat.setElement(1, 0, 1);
    mat.setElement(1, 1, 1);

    Matrix raised = mat ^ (k - 1);

    out << raised.getElement(1, 0) + raised.getElement(0, 0);

    return 0;
}