Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Feb 17, 2025

🧷 문제 링크

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

🧭 풀이 시간

110분

👀 체감 난이도

✏️ 문제 설명

  • $1$ 이상 $N$ 이하의 정수 중 하나가 적혀있는 카드 $M$개가 펼쳐져 있는 책상에서 amsminnbnb2011가 게임을 진행하며, 게임의 규칙은 다음과 같다.
  1. 게임은 교대로 진행되며, amsminn이 먼저 게임을 시작한다.
  2. 각 사람은 자기 차례가 왔을 때, 책상에 남아 있는 카드 중 하나를 가져간다. 이때, 가져간 카드는 이전까지 서로가 가져간 카드 전부와 서로소여야 한다. 그리고 가져간 카드는 책상에서 사라지게 된다.
  3. 자신의 차례가 되었을 때 더 이상 카드가 존재하지 않거나, 규칙에 위배되지 않는 카드를 가져갈 수 없는 사람이 지게 된다.
  • 서로 최선을 다할 때, 누가 이기는지 구해보자.

🔍 풀이 방법

[사용한 알고리즘]

  • bitmask dp
  • 소수 판정

  • 수의 종류가 많아야 150개이고, 잘 관찰하면 각 수를 소인수분해했을 때 가지게 되는 소인수의 종류만 알고있으면 된다.
  • 이 때, 75를 넘는 소수들은 고정으로 1턴을 넘기는 카드로 쓰인다. 따라서, 이 수들이 주어질 때마다 선공을 바꿔주면 된다.
  • 그러면, 고려해야 할 수는 75 이하의 소수들로 좁혀진다. (이 소수들의 수는 최대 21개이다.)
  • 소수가 최대 21개 뿐이므로, $2^21$크기의 dp배열을 정의해서 top-down dp를 돌려주면 된다.

⏳ 회고

1이 주어지는 경우를 생각 못했다.
1도 결국 75 이상의 소수와 같은 역할을 한다.

@oncsr oncsr added success 👍 해설을 보지 않고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때 and removed timeout ⌚ 목표 시간보다 오래걸렸을 때 labels Feb 17, 2025
@ShinHeeEul ShinHeeEul merged commit ddf0c29 into main Feb 17, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants