#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int p; cin >> p; vector low(p, -1), high(p, -1); vector usedLow(p, 0), usedHigh(p, 0); for (int i = 0; i + 1 < p; i++) { cout << "? " << i + 1 << ' ' << i + 1 << endl; int value; cin >> value; if (value == -1) { return 0; } low[i] = (value - 1) % p; high[i] = (value - 1) - low[i]; usedLow[low[i]] = 1; usedHigh[high[i] / p] = 1; } int missingLow = -1; int missingHigh = -1; for (int value = 0; value < p; value++) { if (usedLow[value] == 0) { missingLow = value; } if (usedHigh[value] == 0) { missingHigh = value * p; } } low[p - 1] = missingLow; high[p - 1] = missingHigh; cout << "? 1 " << p << endl; int offdiag; cin >> offdiag; if (offdiag == -1) { return 0; } int candidateLowRows = low[0] + high[p - 1] + 1; bool lowRows = (offdiag == candidateLowRows); cout << "!" << endl; for (int i = 0; i < p; i++) { for (int j = 0; j < p; j++) { if (j > 0) { cout << ' '; } if (lowRows) { cout << low[i] + high[j] + 1; } else { cout << high[i] + low[j] + 1; } } cout << endl; } return 0; }