#include <bits/stdc++.h>
using namespace std;
int fir[5000];
int sec[5000];
int init(int x, int y) {
  printf("? %d %d\n", x, y);
  fflush(stdout);
  scanf("%d", &x);
  return x;
}
void print(int sch, const vector<int> &ans) {
  printf("!\n");
  fflush(stdout);
  printf("%d\n", sch);
  fflush(stdout);
  for (int i = 0; i < ans.size(); i++) printf("%d ", ans[i]);
  fflush(stdout);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) fir[i] = init(0, i);
  for (int i = 0; i < n; i++) sec[i] = init(i, 0);
  vector<int> ans;
  int sch = 0;
  for (int i = 0; i < n; i++) {
    bool t = true;
    int col[5000], p[5000], b[5000];
    b[0] = i;
    memset(col, 0, sizeof col);
    for (int j = 0; j < n; j++) {
      int x = sec[j] ^ b[0];
      if (x >= n || col[x]) {
        t = false;
        break;
      }
      p[j] = x;
      col[x]++;
    }
    if (t) {
      memset(col, 0, sizeof col);
      col[i]++;
      for (int j = 1; j < n; j++) {
        int x = fir[j] ^ p[0];
        if (x >= n || col[x]) {
          t = false;
          break;
        }
        b[j] = x;
        col[x]++;
      }
    }
    if (t) {
      for (int j = 0; j < n; j++)
        if (j != b[p[j]]) t = false;
    }
    if (t) {
      if (!sch) {
        for (int j = 0; j < n; j++) ans.push_back(p[j]);
      }
      sch++;
    }
  }
  print(sch, ans);
  return 0;
}
