#include #include #include #include using namespace std; using ll = long long; ll get_most(char reg, ll times) { map mp; for (ll i = 0; i < times; i++) { cout << "? " << reg << endl; ll val; cin >> val; if (val == -1) { return -1; } mp[val]++; } ll max_times = 0; ll max_val = -1; for (auto it = mp.begin(); it != mp.end(); it++) { if (max_times < it->second) { max_times = it->second; max_val = it->first; } } return max_val; } int main() { const ll iter_times = 2; ll x = get_most('A', iter_times); ll y = get_most('B', iter_times); // 繰り返し二倍法を実装する vector bins(10); for (ll i = 0; i < 10; i++) { if ((y >> i) & 1) { bins[i] = 1; } } vector ans = {x, y, 0}; ll now_x = 0; ll now_ans = 2; for (ll i = 0; i < 10; i++) { // そのビットがあるなら足す if (bins[i]) { while (true) { char reg1 = (char)(now_x + 'A'); char reg2 = (char)(now_ans + 'A'); ll r3 = 3 - now_x - now_ans; char reg3 = (char)(r3 + 'A'); ans[r3] = ans[now_x] + ans[now_ans]; cout << "+ " << reg1 << " " << reg2 << " " << reg3 << endl; ll z; cin >> z; if (z != 0) { return 0; } now_ans = r3; ll val = get_most(reg3, iter_times); if (val == -1) { return 0; } if (val == ans[r3]) { break; } } } // x + x = 2x をする while (true) { char reg1 = (char)(now_x + 'A'); ll r2 = 3 - now_x - now_ans; char reg2 = (char)(r2 + 'A'); cout << "+ " << reg1 << " " << reg1 << " " << reg2 << endl; ans[r2] = ans[now_x] + ans[now_x]; now_x = r2; ll z; cin >> z; if (z != 0) { return 0; } ll val = get_most(reg2, iter_times); if (val == -1) { return 0; } if (val == ans[r2]) { break; } } if (ans[now_ans] == x * y) { break; } } char reg = (char)(now_ans + 'A'); cout << "! " << reg << endl; }