#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 5005;
int a[maxn], b[maxn];
int p[maxn], q[maxn];
int vis[maxn], vis1[maxn];
void ask(int i, int j) {
  fflush(stdout);
  cout << "? " << i << " " << j << endl;
  fflush(stdout);
}
int ansp[maxn];
int main() {
  fflush(stdout);
  cin >> n;
  fflush(stdout);
  for (int i = 0; i < n; i++) {
    fflush(stdout);
    ask(0, i);
    fflush(stdout);
    cin >> a[i];
    fflush(stdout);
  }
  for (int i = 1; i < n; i++) {
    fflush(stdout);
    ask(i, 0);
    fflush(stdout);
    cin >> b[i];
    fflush(stdout);
  }
  int ans = 0;
  bool ok = false;
  for (int i = 0; i < n; i++) {
    p[0] = i;
    memset(vis, 0, sizeof(vis));
    memset(vis1, 0, sizeof(vis1));
    vis[i]++;
    for (int j = 0; j < n; j++) {
      q[j] = p[0] ^ a[j];
      vis1[q[j]]++;
    }
    for (int j = 1; j < n; j++) {
      p[j] = q[0] ^ b[j];
      vis[p[j]]++;
    }
    bool flag = true;
    for (int j = 0; j < n; j++) {
      if (vis[j] != 1 || vis1[j] != 1) flag = false;
    }
    for (int j = 0; j < n; j++) {
      if (p[q[j]] != j) flag = false;
    }
    if (flag) {
      ans++;
      if (!ok) {
        ok = true;
        for (int j = 0; j < n; j++) {
          ansp[j] = p[j];
        }
      }
    }
  }
  cout << "!" << endl;
  fflush(stdout);
  cout << ans << endl;
  fflush(stdout);
  if (ok)
    for (int i = 0; i < n; i++) {
      cout << ansp[i] << " ";
    }
  fflush(stdout);
  return 0;
}
