C.S.G.

월간 향유회 2023. 12. · Arena #15 I번 snrnsidy

이 문제를 풀기 위해서는 게임 이론 dp를 이용하는 방법이 있고, 스프라그 그런디 정리를 이용하는 방법이 있습니다. 여기서는 후자의 방법을 소개합니다.

이전 차례까지 선택한 카드에 적힌 수들의 소인수 집합을 SS라고 할 때, 현재 차례에서 선택할 수 있는 카드는 아래 조건을 만족해야 합니다.

카드에 적힌 수 xx의 소인수들의 집합 SxS_xSS의 교집합이 공집합이여야 합니다.

위에서 말한 집합을 bitmask로 표현할 수 있으며, bitmask에 대한 grundy 수를 구해주면 됩니다.

이는, 위에서 말한 것처럼 "bitmask"&"mask"[x]=0"bitmask" \& "mask"[x] = 0을 만족하는 xx를 선택했을 때의 만들어지는 상태 "bitmask""mask"[x]"bitmask" | "mask"[x]의 grundy 수 집합의 mex 값이 됩니다.

다만, NN 이하의 소수를 전부 고려하는 경우, bitmask로 표현하는 것은 어렵기 때문에 N/2N/2 이하의 소수만 고려하면 됩니다.

이렇게 할 수 있는 이유는 N/2N/2 초과의 소수를 소인수로 갖는 수는 해당 소수가 유일하기 때문입니다.

그리고 N/2N/2 초과의 소수에 대해, 해당 수가 여러개가 등장하더라도 11 하나로 처리하면 됩니다.

그리고, 현재까지 선택한 카드 중에서의 11 개수의 홀짝성을 추가적으로 따져줘야 할 필요가 있습니다. 이를, "parity""parity"라고 하겠습니다.

따라서, 위에서는 grundy 수를 구할 때 현재 상태 하나만 고려했다면 여기에 "parity""parity"도 고려하여 grundy 수를 구해주면 됩니다.

따라서, 초기 상태로부터 grundy 수를 탑다운 방식으로 구하고 해당 값이 00이라면 bnb2011을 출력하고, 00이 아니면 amsminn을 출력하면 됩니다.