[BAEKJOON] 백준 26518: 수열의 극한값 (C#)

2024. 6. 23. 01:37IT/BaekJoon

문제 링크

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

 

 

문제

초항 𝑎1 𝑎2가 정해져 있고 𝑎𝑖=𝑏⋅𝑎𝑖−1+𝑐⋅𝑎𝑖−2 (𝑖≥3)이 성립하는 수열 𝑎에서, 𝑛이 무한히 증가할 때 𝑎𝑛/𝑎𝑛−1의 극한을 구하여라. 이 값은 항상 수렴함을 증명할 수 있다.

 

 

입력

첫 번째 줄에 정수 𝑏, 𝑐, 𝑎1, 𝑎2가 공백으로 구분되어 주어진다. (1≤𝑏,𝑐,𝑎1,𝑎2≤10^9)

 

출력

식의 극한값을 출력한다. 절대/상대 오차는 10^−6까지 허용한다.

 

 

 

통과한 답안

namespace _26518
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            double b = numbers[0];
            double c = numbers[1];

            double r = (b + Math.Sqrt(b * b + 4 * c)) / 2.0;

            Console.WriteLine(r.ToString("F9"));
        }
    }
}

 

주어진 점화식을 이용해서 해당 수열의 극한값을 찾는 문제이다.

an / a(n-1)의 극한 값을 x라고 한다면

an 자리에 주어진 식을 넣어서 정리하면,

b + c *(a(n-2) /a(n-1))이 되고,

(a(n-2) /a(n-1)) 는 1 / x 이므로,

x = b + c / x가 되어 식을 정리하면

x^2 - bx - c = 0로 정리할 수 있다.

 

이 값의 극한값은 근의 공식을 이용해서 구한 값 중의 큰 값이 된다.

따라서 근의 공식을 이용하면,

극한값 x = (b + 루트(b * b + 4 c)) / 2가 된다.

 

이를 식으로 구현한 것이 위의 코드이며,

a1, a2는 사용되지 않았고, b와 c의 범위가 1 이상, 10^9 이하이므로,

int가 아닌 double을 사용해야 되는 문제였다.