Cod sursa(job #2802160)

Utilizator MattiaMattia Iojica Mattia Data 17 noiembrie 2021 17:39:40
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>
#define mod 666013

using namespace std;

ifstream f("kfib.in");
ofstream g("kfib.out");

long long sol[3][3], aux[3][3];
int n;

void inmultireMatrice(long long a[3][3], long long b[3][3])
{
    long long c[3][3];

    for(int i = 1; i <= 2; i++)
        for(int j = 1; j <= 2; j++)
        {
            c[i][j] = 0;
            for(int k = 1; k <= 2; k++)
                c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % mod;
        }

    for(int i = 1; i <= 2; i++)
        for(int j = 1; j <= 2; j++)
            a[i][j] = c[i][j];
}

int main()
{
    f >> n;

    if(n < 3)
        g << 1;
    else
    {
        n -= 2;
        aux[1][1] = aux[1][2] = aux[2][1] = 1;
        sol[1][1] = sol[2][2] = 1;
        for(; n; n /= 2)
        {
            if(n & 1) // n impar
                inmultireMatrice(sol, aux);
            inmultireMatrice(aux, aux);
        }
        g << (sol[1][1] + sol[1][2]) % mod;
    }

    return 0;
}