이 문제를 풀기 위해서는 게임 이론 dp를 이용하는 방법이 있고, 스프라그 그런디 정리를 이용하는 방법이 있습니다. 여기서는 후자의 방법을 소개합니다.
이전 차례까지 선택한 카드에 적힌 수들의 소인수 집합을 라고 할 때, 현재 차례에서 선택할 수 있는 카드는 아래 조건을 만족해야 합니다.
카드에 적힌 수 의 소인수들의 집합 와 의 교집합이 공집합이여야 합니다.
위에서 말한 집합을 bitmask로 표현할 수 있으며, bitmask에 대한 grundy 수를 구해주면 됩니다.
이는, 위에서 말한 것처럼 을 만족하는 를 선택했을 때의 만들어지는 상태 의 grundy 수 집합의 mex 값이 됩니다.
다만, 이하의 소수를 전부 고려하는 경우, bitmask로 표현하는 것은 어렵기 때문에 이하의 소수만 고려하면 됩니다.
이렇게 할 수 있는 이유는 초과의 소수를 소인수로 갖는 수는 해당 소수가 유일하기 때문입니다.
그리고 초과의 소수에 대해, 해당 수가 여러개가 등장하더라도 하나로 처리하면 됩니다.
그리고, 현재까지 선택한 카드 중에서의 개수의 홀짝성을 추가적으로 따져줘야 할 필요가 있습니다. 이를, 라고 하겠습니다.
따라서, 위에서는 grundy 수를 구할 때 현재 상태 하나만 고려했다면 여기에 도 고려하여 grundy 수를 구해주면 됩니다.
따라서, 초기 상태로부터 grundy 수를 탑다운 방식으로 구하고 해당 값이 이라면 bnb2011을 출력하고, 이 아니면 amsminn을 출력하면 됩니다.