#include #include #define rep(i,n) for(int i=0;i P; template ostream& operator<<(ostream& os, const static_modint& a) {os << a.val(); return os;} template ostream& operator<<(ostream& os, const dynamic_modint& a) {os << a.val(); return os;} template istream& operator>>(istream& is, static_modint& a) {long long x; is >> x; a = x; return is;} template istream& operator>>(istream& is, dynamic_modint& a) {long long x; is >> x; a = x; return is;} template istream& operator>>(istream& is, vector& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;} template ostream& operator<<(ostream& os, const pair& p){os << p.first << ' ' << p.second; return os;} template ostream& operator<<(ostream& os, const vector& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); return os;} template ostream& operator<<(ostream& os, const vector>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : ""); return os;} template ostream& operator<<(ostream& os, const set& se){for(T x : se) os << x << " "; os << "\n"; return os;} template ostream& operator<<(ostream& os, const unordered_set& se){for(T x : se) os << x << " "; os << "\n"; return os;} template ostream& operator<<(ostream& os, const atcoder::segtree& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;} template ostream& operator<<(ostream& os, const atcoder::lazy_segtree& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;} template void chmin(T& a, T b){a = min(a, b);} template void chmax(T& a, T b){a = max(a, b);} const int M = 25; int main(){ int len = 1; auto plus = [&](int i, int j){ cout << "a " << i << " + " << j << "\n"; len++; return len; }; auto minus = [&](int i, int j){ cout << "a " << i << " - " << j << "\n"; len++; return len; }; auto multiply = [&](int i, int j){ cout << "a " << i << " * " << j << "\n"; len++; return len; }; auto root = [&](int i, int j){ cout << "a " << i << " r " << j << "\n"; len++; return len; }; auto less = [&](int i, int j){ cerr << "#le" << i << ' ' << j << "\n"; cout << "? " << i << " < " << j << "\n"; char c; cin >> c; cerr << c << "\n"; if(c == 'T') return true; return false; }; auto equal = [&](int i, int j){ cerr << "#eq" << i << ' ' << j << "\n"; cout << "? " << i << " < " << j << "\n"; char c1; cin >> c1; cout << "? " << j << " < " << i << "\n"; char c2; cin >> c2; cerr << c1 << ' ' << c2 << "\n"; if(c1 == 'T' and c2 == 'T') return true; else return false; }; auto answer = [&](bool success){ if(success) cout << "! Yes\n"; else cout << "! No\n"; }; int n = -1; int one = -1; int two = -1; int three = -1; // a = floor(sqrt(N)) + x vector a(M, -1); // a^2 vector a2(M, -1); // a^2 - N vector a2mN(M, -1); // b = floor(sqrt(a^2 - N)) vector b(M, -1); // b^2 vector b2(M, -1); // d = a - b vector d(M, -1); // (N + 3d^2)^2 N vector LHS(M, -1); // ((3d + 1)N + d^3)^2 vector RHS(M, -1); n = 1; one = root(n, n); two = plus(one, one); three = plus(one, two); { a[0] = root(two, n); a2[0] = multiply(a[0], a[0]); } for(int x = 1; x < M; x++){ a[x] = plus(a[x - 1], one); a2[x] = multiply(a[x], a[x]); a2mN[x] = minus(a2[x], n); b[x] = root(two, a2mN[x]); b2[x] = multiply(b[x], b[x]); d[x] = minus(a[x], b[x]); // N + 3d^2 int _alpha = plus(n, multiply(three, multiply(d[x], d[x]))); // (3d + 1)N + d^3 int _beta = plus(multiply(plus(multiply(three, d[x]), one), n), multiply(d[x], multiply(d[x], d[x]))); LHS[x] = multiply(multiply(_alpha, _alpha), n); RHS[x] = multiply(_beta, _beta); } { if(equal(a2[0], n)){ answer(true); return 0; } } { for(int x = 1; x < M; x++){ if(equal(b2[x], a2mN[x])){ if(less(LHS[x], RHS[x]) or equal(LHS[x], RHS[x])) answer(true); else answer(false); return 0; } } } answer(false); return 0; }