fbpx

Problema #1914 – Rica – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Rică a învățat la școală despre șiruri recurente și a primit ca temă să lucreze cu un anumit șir. Rică știe că primele elemente din acest șir sunt următoarele: 1,1,2,4,7,13,24,44,81,149,274,504. Tema lui Rică este să găsească termenul de pe locul X. Rică nu știa să zică… regula şirului nostru, de aceea el vă cere ajutorul.

Deduceți regula de formare a șirului și scrieți un program care să afișeze pentru un X dat, elementul din șir de pe poziția X.

Date de intrare

Fișierul de intrare rica.in conține pe prima linie valoarea lui X.

Date de ieșire

Fișierul de ieșire rica.out va conține pe prima linie valoarea elementului din şirul dat de pe poziţia X.

Restricții și precizări

  • 1 ≤ n ≤ 10.000

Exemple

rica.in rica.out
6 13
12 504
#include <bits/stdc++.h>


using namespace std;

ifstream cin("rica.in");
ofstream cout("rica.out");

int a[10001] , b[10001] , c[10001] , n , m , p , cop[10001];

void invers(int a[] , int n)
{
    int i = 1 , j = n;
    while(i <= j)
    {
        swap(a[i] , a[n - i + 1]);
        i++;
        j--;
    }
}

void adunare(int a[] , int &n , int b[] , int m)
{
    invers(a , n);
    invers(b , m);
    int t = 0;
    for(int i = 1 ; i <= n ; i++)
    {
        int cu = a[i] + b[i] + t;
        a[i] = cu % 10;
        t = cu / 10;
    }
    if(t > 0) a[++n] = t;
    invers(a , n);
}

void copiere(int a[] , int n , int b[] , int m)
{
    for(int i = 1 ; i <= m ; i++)
        a[i] = b[i];
}
int main()
{
    int x;
    cin >> x;
    if(x == 1 || x == 2) cout << 1;
    else if(x == 3) cout << 2;
    else
    {
        a[1] = 1 , b[1] = 1 , c[1] = 2;
        n = 1 , m = 1 , p = 1;
        for(int i = 4 ; i <= x ; i++)
        {
            for(int i = 1 ; i <= p ; i++) cop[i] = c[i];
            int c1 = n , c2 = m , c3 = p;
            adunare(c , p , b , m);
            adunare(c , p , a , n);
            n = c2 , m = c3;
            copiere(a , n , b , m);
            invers(a , n);
            copiere(b , m , cop , p);
        }
        for(int i = 1 ; i <= p ; i++) cout << c[i];
    }
}
Comentarii

S-ar putea sa iti placa