Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🧷 문제 링크
https://www.acmicpc.net/problem/23820
🧭 풀이 시간
60분
👀 체감 난이도
✏️ 문제 설명
길이$N$ 인 수열 $A_1, A_2, \cdots, A_N$ 이 주어지면, $mex( [ A_i \times A_j\ | 1 \le i \le j \le N ] )$ 를 구해보자.
$mex(S)$ 는
집합 S에 포함되지 않은 가장 작은 0 이상의 정수이다.🔍 풀이 방법
[사용한 알고리즘]
우선, 수열의 원소가$2,000,000$ 이하라서 이보다 큰 가장 작은 소수는 절대로 만들 수 없다. => 이 소수를 $P$ 라고 하자.
그리고, 수열에 0이나 1이 없는 경우는 mex값이 각각 0, 1이므로 제외하고 생각한다.
풀이
수열의 원소 중 작은 수부터 볼 것이다.
1️⃣ 어떤 수$a$ 가 수열에 존재하고, $a$ 보다 작은 수들 내에서 $mex$ 값이 $a$ 이상이라면, $a$ 부터 $a^2$ 까지 수 중 $a$ 의 배수는 항상 만들 수 있다고 봐도 상관없다.
따라서, 등장한 원소들 각각에 대해, 직접$A_i$ 부터 ${A_i}^2$ 까지의 $A_i$ 배수들을 만들 수 있다고 체크해주면 된다. ( => 구현은 boolean 배열로 했다.)
이후, 체크한 배열을 돌며 만들 수 없는 가장 작은 수를 찾아내면 된다.
1️⃣ 의 증명
만약$a$ 부터 $a^2$ 까지 수 중 만들 수 없는 $a$ 의 배수가 있다고 가정하고, 그 수를 $a \times b$ 라고 하자.
$b < a$ 이기 때문에, $b$ 가 없어서 생기는 곱의 부재는 $a \times b$ 까지 오기 전에 $b \times b$ 에서 걸러지기 때문이다.
예시
수열$A = [0, 1, 2, 3, 5, 6]$ 이라고 가정하자.$6$ 에 대해, 그 전까지의 수들만을 이용해 $mex$ 를 $6$ 이상으로 만들 수 있다.
$6$ 부터 $36$ 까지의 $6$ 의 배수들을 모두 만들 수 있다고 가정했지만, 실제로는 $6 \times 4 = 24$ 를 만들 수 없다.$mex$ 값으로 $24$ 가 가능한지 확인하기 전에, 이미 $4$ 의 부재로 $mex$ 는 $16$ 을 만들 수 없게 된다.
원소
하지만,
시간복잡도
이 문제에서 중복 값을 가지는 원소가 있다면, 굳이 여러 번 수행할 필요 없이 중복을 제거해도 상관없다.
각 원소$A_i$ 에 대해, 체크 작업의 연산량은 $\dfrac{2,000,000}{A_i}$ 이다.$X$ 라 할 때, $O(\frac{X}{2} + \frac{X}{3} + \cdots + \frac{X}{X})$ 이다.
$\Rightarrow$ $O(X\log{X})$ 이다. (조화수열의 합 $\frac{1}{1} + \frac{1}{2} + \cdots + \frac{1}{X} = O(\log{X})$ 이기 때문)
따라서 시간 복잡도는 원소의 최댓값을
더 쉬운 풀이
풀고 나니까 훨씬 더 쉬운 풀이가 생각났다.
각 원소$A_i$ 의 배수들 중 $P$ 보다 작은 수들을 $K$ 라고 하자.$\frac{K}{A_i}$ 가 수열에 존재하는지 체크해서, $K$ 를 만들 수 있는지 여부를 저장한다.
반복문 한 번으로
이 역시 조화수열의 합에 의해 시간 내에 통과될 수 있는 풀이다.
⏳ 회고
진짜 수학 너무 어렵다