#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(){ sieve(MAX-2); int N;cin>>N; if(N<=3){ vector> res(N,vector(N)); for(int a=1;a<=N;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{ vector> ans(N,vector(N)); for(int a=1;a<=N;a++){ for(int b=1;b<=N;b++){ ans[a-1][b-1]=gcd(P[a-1],Q[b-1]); } } if(ans==res){ 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; 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); int zzz; for(int i=0;i P(N),Q(N); for(int i=0;i>x; for(int j=1;j<=N;j++){ if(tar*j/gcd(tar,j)==x) P[i]=j; } } for(int i=0;i>Q[j]; } } } cout<<"!"; for(int a:P) cout<<" "<