264
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