Cod sursa(job #2636714)

Utilizator pregoliStana Andrei pregoli Data 19 iulie 2020 13:07:05
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
///***********************
using ll = long long;
const int MOD = 666013;
int k;
int a[3][3], b[3][3], mtp[3][3];

void multMat(int x[][3], int y[][3]) {
    int r[3][3];
    ll sum;
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= 2; j++) {
            sum = 0;
            for (int k = 1; k <= 2; k++)
                sum += (1LL * x[i][k] * y[k][j]);
            r[i][j] = sum % MOD;
        }
    memcpy(x, r, sizeof(r));
}

void lgPow(int p) {
    mtp[1][1] = mtp[2][2] = 1;
    while (p) {
        if (p & 1)
            multMat(mtp, b);
        multMat(b, b);
        p >>= 1;
    }
}

int main() {
    fin >> k;
    if (!k)
        fout << 0;
    else if (k <= 2)
        fout << 2;
    else {
        a[1][2] = 1;
        b[1][2] = b[2][1] = b[2][2] = 1;
        lgPow(k - 1);
        multMat(a, mtp);
        fout << a[1][2];
    }
    fout << newline;//*/
    fout.close();
    return 0;
}