#include <bits/stdc++.h>
const int N = 810;
const int M = 10;
int mod[N][M];
int ans[N], inv[N], a[N];
int n;
void print() {
  if (ans[1] > n / 2) {
    for (int i = 1; i <= n; ++i) {
      ans[i] = n + 1 - ans[i];
    }
  }
  printf("!");
  for (int i = 1; i <= n; ++i) {
    printf(" %d", ans[i]);
  }
  puts("");
}
int ask(std::vector<int> vec, int calcmod) {
  int n = vec.size();
  printf("? %d", n);
  for (auto u : vec) {
    printf(" %d", u);
  }
  puts("");
  fflush(stdout);
  int ret;
  scanf("%d", &ret);
  if (calcmod > 0) {
    if (ret) {
      int sum = 0;
      for (auto u : vec) {
        if (u != calcmod) {
          sum = (sum + ans[u]) % n;
        }
      }
      mod[calcmod][n] = (n - sum) % n;
    }
  }
  return ret;
}
int main() {
  scanf("%d", &n);
  memset(mod, -1, sizeof(mod));
  mod[1][2] = 1;
  for (int i = 1; i < n; ++i) {
    mod[i + 1][2] = mod[i][2] ^ (1 - ask({i, i + 1}, 0));
  }
  for (int i = 1; i <= 4 && i <= n / 2; ++i) {
    std::vector<int> todo;
    for (int j = 1; j <= n; ++j) {
      if (!ans[j]) {
        todo.emplace_back(j);
      }
    }
    for (auto j : todo) {
      std::vector<int> vec;
      for (auto k : todo) {
        if (j != k) {
          vec.emplace_back(k);
        }
      }
      if (ask(vec, 0)) {
        ans[j] = mod[j][2] == i % 2 ? i : n + 1 - i;
        inv[ans[j]] = j;
      }
    }
  }
  if (n <= 8) {
    print();
    return 0;
  }
  for (int i = 3; i <= 7; i += 2) {
    using pii = std::pair<int, int>;
    std::vector<pii> to_check;
    std::vector<int> known;
    for (int j = 0; j <= i / 2; ++j) {
      to_check.emplace_back(1, n - 3 + j);
    }
    for (int j = 1; j <= i / 2; ++j) {
      to_check.emplace_back(i / 2 + 1, n - 3 + j);
    }
    for (int j = 0; j <= i / 2; ++j) {
      known.emplace_back(j + 1);
      known.emplace_back(j + n - 3);
    }
    for (auto p : to_check) {
      for (int j = 1; j <= n; ++j) {
        if (ans[j] || mod[j][i] != -1) {
          continue;
        }
        std::vector<int> vec = {j};
        for (auto u : known) {
          if (u == p.first || u == p.second) {
            continue;
          }
          vec.emplace_back(inv[u]);
        }
        ask(vec, j);
      }
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (ans[i]) {
      continue;
    }
    ask({inv[1], inv[2], inv[3], i}, i);
    if (mod[i][4] != -1) {
      continue;
    }
    ask({inv[1], inv[2], inv[4], i}, i);
    if (mod[i][4] != -1) {
      continue;
    }
    mod[i][4] = mod[i][2] == 1 ? 3 : 0;
  }
  std::vector<bool> calced(8);
  int sum = 0;
  for (int i = 1; i <= 4; ++i) {
    sum += n - 4 + i;
    sum += i;
  }
  for (int i = 1; i <= 4; ++i) {
    calced[(8 - (sum - i) % 8) % 8] = true;
  }
  for (int i = 1; i <= n; ++i) {
    if (ans[i]) {
      continue;
    }
    int pos = 0;
    for (int j = 1; j <= 4; ++j) {
      if ((sum - j) % 4 == (4 - mod[i][4]) % 4) {
        pos = j;
        break;
      }
    }
    std::vector<int> vec = {i};
    for (int j = 1; j <= 4; ++j) {
      vec.emplace_back(inv[n - 4 + j]);
      if (j != pos) {
        vec.emplace_back(inv[j]);
      }
    }
    ask(vec, i);
    if (mod[i][8] == -1) {
      mod[i][8] = (calced[mod[i][4]] ? 4 : 0) ^ mod[i][4];
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (ans[i]) {
      continue;
    }
    for (int j = 1; j <= n; ++j) {
      bool flag = true;
      for (auto u : {3, 5, 7, 8}) {
        if (j % u != mod[i][u]) {
          flag = false;
          break;
        }
      }
      if (flag) {
        ans[i] = j;
        break;
      }
    }
  }
  print();
}
