이동식 저장소

10253. 헨리 본문

Problem Solving/BOJ

10253. 헨리

해스끼 2020. 10. 22. 18:23

 

 

10253번: 헨리

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 개수 T 가 정수로 주어진다. 각 테스트 데이터는 한 줄로 구성되며, 여기

www.acmicpc.net


뭔가 흥미로운 수학 이야기가 있다. 문제에서 시키는 대로 구현하면 된다.

 

단, 아주 나이브하게 이중 반복문으로 구현하면 시간 초과가 난다. 다음의 세 가지를 고려해야 한다.

1. 1xab인 최대의 1x 찾기

부동 소수점 연산을 피하기 위해 수식을 bax로 바꾸자. 조건을 만족하는 가장 큰 1x를 찾으려면 가장 작은 x를 찾으면 된다.

 

물론 x=b부터 시작하여 조건을 만족하지 않을 때까지 x1씩 감소시켜도 된다. 그러나 문제에서 테스트케이스의 수 T가 주어지지 않았고, 이 방법을 사용하면 시간복잡도 O(Tb2)로 시간 초과를 피하기 어려워 보인다.

 

따라서 이분 탐색(이진 탐색 아니다!)을 사용하여 O(logb) 시간에 x를 찾아야 한다. left=1, right=b+1로 두고 [left, right) 구간의 mid를 계산하여 x를 찾으면 된다. 이렇게 하면 전체 시간복잡도가 O(Tblogb)로 시간 초과를 피할 수 있다.

2. 자료형

분수가 등장하는 문제는 웬만하면 실수형을 사용하지 않는 것이 좋다. 웬만하면 나는 분자와 분모를 각각 정수형으로 놓고 계산한다. 여기서는 분자를 a, 분모를 b라고 하자.

 

ab1x=axbbx에서 문제의 조건에 의해 bx<231이므로 bxint 자료형에 담을 수 있다. 하지만 axbint의 범위를 넘어갈 수 있으므로 ab를 64비트 정수형으로 저장하는 것이 안전하다.

3. ab의 배수일 경우

ab의 최대공약수를 gcd라고 하면, ab는 기약분수 1b/gcd로 나타낼 수 있다. a/gcd=1인 이유는 ab의 배수이므로 b=a×gcd 꼴로 나타낼 수 있기 때문이다. 이처럼 분자가 1인 경우 분모가 정답이므로 계속 계산할 필요 없이 즉시 정답을 출력해야 한다. 안 그러면 시간초과 난다.


mazassumnida

 

'Problem Solving > BOJ' 카테고리의 다른 글

3000. 직각삼각형  (0) 2020.11.20
2610. 회의준비  (0) 2020.11.13
1328. 고층 빌딩  (0) 2020.10.16
1562. 계단 수  (0) 2020.10.13
7578. 공장  (1) 2020.10.04
Comments