Cod sursa(job #2894480)

Utilizator mateicosCostescu Matei mateicos Data 27 aprilie 2022 21:05:43
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <cstdio>
#define MOD 666013

using namespace std;

struct fib{
    int a[2][2];
};

fib mult(fib a, fib b){
    fib c;
    c.a[0][0] = (1LL * a.a[0][0] * b.a[0][0] +  1LL * a.a[0][1] * b.a[1][0]) % MOD;
    c.a[0][1] = (1LL * a.a[0][0] * b.a[0][1] +  1LL * a.a[0][1] * b.a[1][1]) % MOD;
    c.a[1][0] = (1LL * a.a[1][0] * b.a[0][0] +  1LL * a.a[1][1] * b.a[1][0]) % MOD;
    c.a[1][1] = (1LL * a.a[1][0] * b.a[0][1] +  1LL * a.a[1][1] * b.a[1][1]) % MOD;
    return c;
}

void fast_pow(int k){
    fib a, b;
    int p2;
    a.a[0][0] = 0;
    a.a[1][0] = a.a[1][1] = a.a[0][1] = 1;
    b.a[0][0] = b.a[1][1] = 1;
    b.a[0][1] = b.a[1][0] = 0;
    for(p2 = 1;k > 0;p2<<=1){
        if(k & p2){
            k -= p2;
            b = mult(b, a);
        }
        a = mult(a, a);
    }
    printf("%d", b.a[0][0]);
}

int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);
    int k;
    scanf("%d", &k);
    fast_pow(k + 1);
    return 0;
}