fbpx

Problema #3344 – Fibonacci2 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Șirul lui Fibonacci este definit astfel:

Fn={1Fn1+Fn2dacă n=1 sau n=2,dacă n>2.Fn={1dacă n=1 sau n=2,Fn1+Fn2dacă n>2.

Se dă un număr natural n. Determinați al n-lea termen al șirului, modulo 666013.

Date de intrare

Programul citește de la tastatură numărul n.

Date de ieșire

Programul va afișa pe ecran numărul F, reprezentând al n-lea termen al șirului, modulo 666013.

Restricții și precizări

  • 1 ≤ n ≤ 2.000.000.000

Exemplu

Intrare

6

Ieșire

8

Explicație

Termenii sunt: 1 1 2 3 5 8 13 21 34 55 89 ...

#include <bits/stdc++.h>
using namespace std;

#define MOD 666013

void produs(long long P[][2] , long long A[][2] , long long B[][2])
{
    P[0][0] = (A[0][0] * B[0][0] + A[0][1] * B[1][0]) % MOD;
    P[0][1] = (A[0][0] * B[0][1] + A[0][1] * B[1][1]) % MOD;
    P[1][0] = (A[1][0] * B[0][0] + A[1][1] * B[1][0]) % MOD;
    P[1][1] = (A[1][0] * B[0][1] + A[1][1] * B[1][1]) % MOD;
}

void copiere(long long A[][2] , long long B[][2])
{
    for(int i = 0 ; i <= 1 ; i++)
        for(int j = 0 ; j <= 1 ; j++)
            A[i][j] = B[i][j];
}

int fibo(int n)
{
    long long A[2][2] = {{1 , 1} , {1 , 0}} , P[2][2] = {{1 , 0} , {0 , 1}} , B[2][2];
    while(n > 0)
    {
        if(n % 2 == 1)
        {
            produs(B , A , P);
            copiere(P , B);
        }
        produs(B , A , A);
        copiere(A , B);
        n /= 2;
    }
    return P[0][1];
}

int main()
{
    int n;
    cin >> n;
    cout << fibo(n);
    return 0;
}
Comentarii

S-ar putea sa iti placa