#include using namespace std; typedef long long ll; templatebool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b prime;//i番目の素数 bool is_prime[MAX+1]; void sieve(int n){ for(int i=0;i<=n;i++){ is_prime[i]=true; } is_prime[0]=is_prime[1]=false; for(int i=2;i<=n;i++){ if(is_prime[i]){ prime.push_back(i); for(int j=2*i;j<=n;j+=i){ is_prime[j] = false; } } } } int main(){ std::ifstream in("text.txt"); std::cin.rdbuf(in.rdbuf()); cin.tie(0); ios::sync_with_stdio(false); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); sieve(MAX-2); int N;cin>>N; if(N<=4){ vector> res(N,vector(N)); for(int a=1;a<=min(N,3);a++){ for(int b=1;b<=N;b++){ cout<<"? "<>x; res[a-1][b-1]=x; } } vector P(N);iota(all(P),1); vector Q=P; do{ do{ bool ok=true; for(int a=1;a<=min(N,3);a++){ for(int b=1;b<=N;b++){ ok&=res[a-1][b-1]==P[a-1]*Q[b-1]/gcd(P[a-1],Q[b-1]); } } if(ok){ cout<<"!"; for(int a:P) cout<<" "<,int> MA; for(int a=1;a<=N;a++){ vector S(N); for(int b=1;b<=N;b++){ S[b-1]=a*b/gcd(a,b); } sort(all(S)); MA[S]=a; } vector que(N),SS; int st=rng()%N+1; for(int i=0;i>x; que[i]=x; } SS=que; sort(all(SS)); int x=MA[SS]; int tar=-1; for(int i=1;i<=N;i++){ if(is_prime[i]&&i+i>N) tar=i; } int tarlcm=x*tar/gcd(x,tar); vector W; int zzz; for(int i=0;i P(N),Q(N); vector Z; for(int i=0;i>x; for(int j=1;j<=N;j++){ if(tar*j/gcd(tar,j)==x){ P[i]=j; if(j==1) Z.push_back(i); } } } int ttt; if(zzz==0) ttt=1; else ttt=0; cout<<"? "<>z; if(z>N) P[Z[1]]=1; else P[Z[0]]=1; Q[zzz]=tar; for(int i=0;i>Q[j]; } } } cout<<"!"; for(int a:P) cout<<" "<