Cod sursa(job #3251630)

Utilizator patrickunudoiBeres Patrick Stefan patrickunudoi Data 26 octombrie 2024 12:17:14
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>
#define MOD 666013

using namespace std;

struct mat
{
    int64_t a11, a12, a21, a22;
};
mat matMul(mat mat1, mat mat2)
{
    mat ans;

    ans.a11 = (mat1.a11 * mat2.a11 % MOD + mat1.a12 * mat2.a21 % MOD) % MOD;
    ans.a12 = (mat1.a11 * mat2.a12 % MOD + mat1.a12 * mat2.a22 % MOD) % MOD;
    ans.a21 = (mat1.a21 * mat2.a11 % MOD + mat1.a22 * mat2.a21 % MOD) % MOD;
    ans.a22 = (mat1.a21 * mat2.a12 % MOD + mat1.a22 * mat2.a22 % MOD) % MOD;

    return ans;
}


mat fastExp(mat base, int exp)
{
    mat ans = mat{1, 0, 0, 1};

    while (exp > 0)
    {   
        if (exp & 1)
            ans = matMul(ans, base);
        exp >>= 1;
        base = matMul(base, base);
    }
    return ans;
}

int main()
{
    int n;
    ifstream cin("kfib.in");
    ofstream cout("kfib.out");
    cin >> n;
    
    
    mat base = mat{1, 1, 1, 0};
    base = fastExp(base, n - 1);
    cout << base.a11 << endl;


    return 0;
}