Cod sursa(job #2670560)

Utilizator marquiswarrenMajor Marquis Warren marquiswarren Data 10 noiembrie 2020 10:50:33
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

const int MOD = 666013;

struct Matrix {
    int a[2][2]{0};

    Matrix() = default;

    Matrix(int x, int y, int z, int t) {
        a[0][0] = x;
        a[0][1] = y;
        a[1][0] = z;
        a[1][1] = t;
    }

    static Matrix I_2() { return {1, 0, 0, 1}; }

    friend void operator*=(Matrix &A, const Matrix &B) {
        Matrix R;

        for (int i = 0; i < 2; i++)
            for (int j = 0; j < 2; j++)
                for (int k = 0; k < 2; k++)
                    R.a[i][j] = (R.a[i][j] + 1LL * A.a[i][k] * B.a[k][j]) % MOD;

        A = R;
    }

    friend Matrix operator^(Matrix A, unsigned p) {
        Matrix R = Matrix::I_2();

        for (; p; p >>= 1) {
            if (p & 1) R *= A;
            A *= A;
        }

        return R;
    }

    int item() { return a[1][0]; }
};


int main() {
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);

    unsigned k;
    scanf("%d", &k);

    Matrix m(0, 1, 1, 1);
    printf("%d\n", (m ^ k).item());

    return 0;
}