를 정수 를 받았을 때 반드시 이길 수 있는지 확인하는 함수로 정의합시다. 반환값은 혹은 입니다.
해당 차례의 플레이어가 할 수 있는 선택은 부터 보다 같거나 작은 모든 완전 제곱수 를 시도하고 이 인 선택을 하면 됩니다. 는 참조적 투명성을 만족하므로 DP를 적용할 수 있고, 존재하는 부분 문제는 개, 문제 하나의 시간 복잡도는 이여서 의 시간 복잡도지만 실제로는 이보다는 살짝 적습니다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder bw = new StringBuilder();
boolean[] dp = new boolean[1000001];
for (int i = 1; i <= 1000000; i++)
for (int j = 1; j * j <= i; j++)
if (!dp[i - j * j]) {
dp[i] = true;
break;
}
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
bw.append(dp[Integer.parseInt(br.readLine())] ? "koosaga" : "cubelover");
bw.append("\n");
}
System.out.print(bw);
}
}