#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5010;
int n;
int Xor[MAXN], a[MAXN], b[MAXN], x[MAXN << 1], res[MAXN];
bool vis[MAXN];
bool Judge() {
  memset(vis, false, sizeof(vis));
  for (int i = 0; i < n; i++) {
    if (a[i] >= n || vis[a[i]]) return false;
    vis[a[i]] = 1;
  }
  for (int i = 0; i < n; i++) b[a[i]] = i;
  for (int i = 1; i < 2 * n - 1; i++) {
    if ((a[i / 2] ^ b[(i - 1) / 2]) != x[i]) return false;
  }
  return true;
}
int main() {
  scanf("%d", &n);
  int ans = 0;
  for (int i = 1; i < 2 * n - 1; i++) {
    printf("? %d %d\n", i / 2, (i - 1) / 2);
    fflush(stdout);
    scanf("%d", &x[i]);
    ans ^= x[i];
    if (i % 2 == 0) Xor[i / 2] = ans;
  }
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    a[0] = i;
    for (int j = 1; j < n; j++) a[j] = (i ^ Xor[j]);
    if (Judge()) {
      cnt++;
      for (int j = 0; j < n; j++) {
        res[j] = a[j];
      }
    }
  }
  printf("!\n");
  printf("%d\n", cnt);
  if (cnt) {
    for (int i = 0; i < n; i++) printf("%d ", res[i]);
  }
}
