Cod sursa(job #3121729)

Utilizator alinatomi14Tomita Alina alinatomi14 Data 14 aprilie 2023 23:43:13
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>
#define L long long
#define NM 1000000
using namespace std;
ifstream in("kfib.in");
ofstream out("kfib.out");
unsigned L n;
struct m2
{
    L a,b,c,d;
};
struct m1
{
    L a,b;
};
m2 inm(m2 a,m2 b)
{
    m2 c;
    c.a=(a.a*b.a+a.b*b.c)%666013;
    c.b=(a.a*b.b+a.b*b.d)%666013;
    c.c=(a.c*b.a+a.d*b.c)%666013;
    c.d=(a.c*b.b+a.d*b.d)%666013;
    return c;
}
m1 inm1(m2 a, m1 b)
{
    m1 c;
    c.a=(a.a*b.a+a.b*b.b)%666013;
    c.b=(a.c*b.a+a.d*b.b)%666013;
    return c;
}
m2 exp(m2 a,L x)
{
    m2 s=a;
    --x;
    while(x)
    {
        if(x%2)
            s=inm(s,a),--x;
        else
            a=inm(a,a),x>>=1;
    }
    return s;
}
int main()
{
    in>>n;
    if (n<=2)
    {
        out<<1;
        return 0;
    }
    m2 d= {1,1,1,0};
    m1 d1= {1,1};
    m1 c=inm1(exp(d,n-2),d1);
    out<<c.a;
}