티스토리 뷰

백준 문제풀이

백준[baekjoon] 26518

소심야채 2022. 12. 26. 20:46

https://www.acmicpc.net/problem/26518

 

26518번: 수열의 극한값

첫 번째 줄에 정수 $b$, $c$, $a_1$, $a_2$가 공백으로 구분되어 주어진다. $(1 \leq b, c, a_1, a_2 \leq 10^9)$

www.acmicpc.net

문제풀이

$$a_i = b*a_{i-1} + c*a_{i-2} (i \geq 3)$$

수열 a가 주어졌을때

$$\lim_{n \to inf}\frac{a_n}{a_{n-1}}$$

값을 구하는 문제로써 문제에서 항상 이 값이 수렴되어짐이 보장되어 있다.

 

문제에서 주어지는 정수범위로 인해 순차적으로 수열값(a_n)을 구하면서 극한 값을 접근하는 시도는 long long int를 사용하더라도 오버플로우가 발생한다.

 

따라서 적절하게 식을 변형시켜 오버플로우를 방지해주어야 한다.

$$a_n = b*a_{n-1} + c*a_{n-2}, 양변에 a_{n-1} 나누기 $$

$$\lim_{n \to inf}\frac{a_n}{a_{n-1}} = b + c*\lim_{n \to inf}\frac{a_{n-2}}{a_{n-1}}$$

 

$$\frac{a_n}{a_{n-1}} 값이 x일때 \, \frac{a_{n+1}}{a_n}값은 b+\frac{c}{x}이다.$$

 

극한값이 수렴하니 n을 계속증가하여 일정한 값이 나올때까지 반복하면된다.

 

코드

#include<bits/stdc++.h>

using namespace std;

int main()
{
   ios_base::sync_with_stdio(0), cin.tie(0);

   int b, c, a1, a2;
   double past, cur;

   cin >> b >> c >> a1 >> a2;
   past = (double)a1/a2;

   cout << fixed;
   cout.precision(6);

   while(true) {
      cur = c/past + b;

      if((float)cur == (float)past) {
         cout << cur << '\n';
         break;
      }

      past = cur;
   }

   return 0;
}

 

'백준 문제풀이' 카테고리의 다른 글

백준[baekjoon] 27469  (0) 2023.02.12
백준[baekjoon] 2961  (0) 2023.01.25
백준[baekjoon] 17142  (0) 2021.05.09
백준[baekjoon] 6064  (0) 2021.02.15
백준[baekjoon] 2336  (0) 2021.02.11
댓글