#include #include typedef long long ll; typedef long double lb; using namespace std; using namespace atcoder; #define all(x) (x).begin(), (x).end() #define OVERLOAD_REP(_1, _2, _3, name, ...) name #define REP1(i, n) for (auto i = std::decay_t{}; (i) != (n); ++(i)) #define REP2(i, l, r) for (auto i = (l); (i) != (r); ++(i)) #define rep(...) OVERLOAD_REP(__VA_ARGS__, REP2, REP1)(__VA_ARGS__) template bool chmin(T& a, const T& b){if(a > b){a = b; return 1;} return 0;} template bool chmax(T& a, const T& b){if(a < b){a = b; return 1;} return 0;} const ll INF = 1000000000000000000; // 10^18 int main(){ ll n; cin >> n; vector v(n-1); ll non_zero_1 = -1; ll non_zero_2 = -1; string s = "! "; //v[i] 10^n-1と10^iの積 for(int i = 0;i < n-1;i++){ cout << "? " << i << " " << n-1 << endl; cin >> v[i]; if(v[i] != 0 && non_zero_1 == -1){ non_zero_1 = i; }else if(v[i] != 0 && non_zero_2 == -1){ non_zero_2 = i; } } vector d(9,true); ll true_count = 9; //d[i] : 10^n-1が、i+1であれば、true for(int i = 1;i <= 9;i++){ rep(j,v.size()){ if(v[j] % (i) != 0){ d[i-1] = false; true_count--; break; } } } if(true_count == 1){ //cout << "! "; ll nn = -1; for(int i = 1;i <= 9;i++){ if(d[i-1] == true){ nn = i; // cout << i; s += to_string(i); } } for(int i = n-2;i >= 0;i--){ // cout << v[i] / nn; s += to_string(v[i]/nn); } //cout << endl; }else if(non_zero_2 == -1){ cout << "! " << -1 << endl; }else{ cout << "? " << non_zero_1 << " " << non_zero_2 << endl; ll tmp; cin >> tmp; ll nn = (ll)sqrt((double)v[non_zero_1]*(double)v[non_zero_2]/(double)tmp); //cout << "! " << nn; s += to_string(nn); for(int i = n-2;i >= 0;i--){ // cout << v[i] / nn; s += to_string(v[i] / nn); } //cout << endl; } if(s.size() != n+2){ int t = n; int x = 2/(t-n); cout << x << endl; }else{ cout << s << endl; } return 0; }