게임 이론 문제이다. 풀이는 스프라그 그런디 정리의 확장으로 풀 수도 있고, 애드 혹으로도 풀 수 있다. 애드 혹으로 풀자면 u가 0인 경우, 1인 경우, 1보다 큰 경우로 나누면 문제를 해결할 수 있다.
<aside> 💡 핵심 아이디어는 s와 n에 숫자가 있는 경우엔 게임에서 질 것 같은 상대가 최대한 무한루프를 만들려고 한다는 점이다. 만약 s와 n에 숫자가 없다면, u의 값에 따라서 쉽게 경우가 나뉜다.
</aside>
그대로 코드로 옮기면 다음과 같다.
#include <bits/stdc++.h>
#define int long long
#define float long double
#define pp pair<int, int>
#define tp tuple<int, int, int>
#define mtp make_tuple
#define mp make_pair
using namespace std;
using lf = __float128;
using ld = __int128;
float pi = 3.141592653589793238462643383279502884197169399375105Q;
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
int ddx[8] = {0, 0, 1, -1, 1, 1, -1, 1}, ddy[8] = {1, -1, 0, 0, 1, -1, 1, -1};
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
int t;
cin >> t;
int s, n, u, p, c;
for (int i = 0; i < t; i++) {
cin >> s >> n >> u >> p >> c;
p %= 2;
int ans;
if (u == 0) {
if (p == 1) {
if (s + n > 0)
ans = -1;
else
ans = 1;
} else {
if (s + n > 0)
ans = -1;
else
ans = 0;
}
}
if (u == 1) {
if (p == 1) {
if (s + n > 0)
ans = -1;
else
ans = 1;
} else
ans = -1;
}
if (u > 1) {
ans = -1;
}
if (ans == 1) {
cout << "geometry\\n";
}
if (ans == 0) {
cout << "number_theory\\n";
}
if (ans == -1) {
cout << "hanbyeol\\n";
}
}
return 0;
}