Cod sursa(job #2839364)

Utilizator EusebiudistrugatorulLionel Messi Eusebiudistrugatorul Data 25 ianuarie 2022 20:26:14
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
//#define int long long
#define ll pair<long long, long long>
using namespace std;
int const mod = 666013;
ifstream fin("kfib.in");
ofstream fout("kfib.out");

vector<vector<int>> find_product(vector<vector<int>> m1, vector<vector<int>> m2) {
    int rows1 = m1.size(), cols1 = m1[0].size(), cols2 = m2[0].size();
    vector<vector<int>> ans(rows1, vector<int>(cols2));
    for (int i = 0; i < rows1; ++i) {
        for (int j = 0; j < cols2; ++j) {
            for (int k = 0; k < cols1; ++k) {
                ans[i][j] = 1LL * ans[i][j] + 1LL * m1[i][k] * m2[k][j] % mod;
                ans[i][j] %= mod;
            }
        }
    }
    return ans;
}

vector<vector<int>> fast_expo(vector<vector<int>> m1, int pw) {
    if (pw == 1) {
        return m1;
    }
    vector<vector<int>> ans = fast_expo(m1, pw / 2);
    ans = find_product(ans, ans);
    if (pw & 1) {
        ans = find_product(ans, m1);
    }
    return ans;
}

int32_t main() {
    ios_base::sync_with_stdio(false), cin.tie(NULL);
    int tests = 1;
    //cin >> tests;
    while (tests--) {
        int n;
        fin >> n;
        vector<vector<int>> m(2, vector<int>(2)), basecase(2, vector<int>(1));
        m[0][0] = m[0][1] = m[1][0] = 1;
        basecase[0][0] = 1;
        vector<vector<int>> ans = find_product(fast_expo(m, n - 1), basecase);
        fout << ans[0][0];
    }
    return 0;
}