문제 링크
- https://icpc.me/27470
사용 알고리즘
- 랜덤
풀이
집합의 원소를 아무거나 하나 선택해 봅시다. 만약 문제에서 요구하는 부분 집합이 존재한다면, 임의로 선택한 원소를 포함하는 정답이 존재할 확률이 $50\%$ 이상입니다. 따라서 다음과 같은 성공 확률이 $50\%$ 이상인 알고리즘을 유도할 수 있습니다.
- 집합의 원소 $x$를 임의로 하나 선택
- $x$의 모든 소인수 $d$에 대해, 집합에서 $d$의 배수의 개수를 카운팅
- 만약 $d$의 배수의 개수가 $(N+1)/2$개 이상이라면 출력하고 프로그램 중단
부분 집합이 존재한다면 $x$를 포함하는 정답이 존재할 확률이 $50\%$ 이상이라는 것은, 반대로 말하면 위 알고리즘이 실패할 확률이 $1/2$ 이하라는 의미입니다. 따라서 위 알고리즘을 $K$번 반복하면 정답이 존재하는데 찾지 못할 확률이 $1/2^K$ 수준으로 내려갑니다. 2~30번 정도 반복하면 매우 높은 확률로 문제를 풀 수 있습니다.
전체 코드
1 |
|