Cod sursa(job #3167450)

Utilizator Rares0netOnet Rares-Petru Rares0net Data 10 noiembrie 2023 18:44:44
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
//Rares 0net
#ifdef RS
#define RS
#endif
#ifdef RS
    #include "Rares0.hpp"
#else
    #include<fstream>
    #include<vector>
    using namespace std;
    const string N_file="kfib";
    ifstream fin(N_file+".in");
    ofstream fout(N_file+".out");
    #define cin fin
    #define cout fout
#endif
void RSinit()
{
    cin.tie(0)->sync_with_stdio(false);
    cout.tie(0);
}
#define MOD 666013
using LL=long long int;
using VL=vector<LL>;
using VVL=vector<VL>;
VVL Multiplicare(const VVL &mtr1, const VVL &mtr2)
{
    size_t size=mtr1.size();
    VVL ans(size, VL(size, 0));
    for(size_t i=0; i<size; ++i)
        for(size_t j=0; j<size; ++j)
            for(size_t k=0; k<size; ++k)
                ans[i][j]=(ans[i][j]+(mtr1[i][k]*mtr2[k][j])%MOD)%MOD;
    return ans;
}
VVL PowTimpLog(const VVL &base, LL p)
{
    size_t size=base.size();
    VVL ans(size, VL(size, 0));
    for(size_t i=0; i<size; ++i)
        ans[i][i]=1;
    VVL pVechi=base;
    while(p)
    {
        if(p%2==1)
            ans=Multiplicare(ans, pVechi);
        pVechi=Multiplicare(pVechi, pVechi);
        p/=2;
    }
    return ans;
}
void Solve()
{
    VVL MtrMultiplu=
    {
        {0, 1},
        {1, 1}
    };
    LL k;
    cin>>k;
    MtrMultiplu=PowTimpLog(MtrMultiplu, k);
    LL ans=MtrMultiplu[0].back();
    cout<<ans;
}
main()
{
    RSinit();
    Solve();
}