#include #include #include #include #include using namespace std; int gcd(int a,int b) { while(b) { int t=a%b; a=b; b=t; } return a; } bool isp[1001]; int N; int A[1000],B[1000]; int aA[1000],aB[1000]; int ask(int i,int j) { cout<<"? "<>x; return x; } void answer() { cout<<"!"; for(int i=0;i void setup() { random_device seed_gen; unsigned int seed=seed_gen(); cout<<"seed = "<>N; for(int i=2;i<=N;i++)isp[i]=true; for(int i=2;i<=N;i++)if(isp[i]) { for(int j=i+i;j<=N;j+=i)isp[j]=false; } if(N==1) { A[0]=B[0]=1; answer(); } if(N==2) { bool fn=false; int a,b; for(int i=0;!fn&&i<2;i++)for(int j=0;!fn&&j<2;j++) { if(ask(i,j)==1) { a=i,b=j; fn=true; } } A[0]=A[1]=B[0]=B[1]=2; A[a]=B[b]=1; answer(); } int T[1000]; int mini=0; for(int i=0;iT[i])mini=i; } A[0]=T[mini]; int cnt[1001]={}; for(int i=0;i1)continue; int p=T[i]/A[0]; if(!isp[p]||p*3<=N)continue; P=p; Pi=i; break; } assert(Pi!=-1); B[Pi]=P; for(int i=1;ione; for(int i=0;itest; for(int i=0;i=2); int ONE; if(ask(one[0],test[0])%P!=0||ask(one[0],test[1])%P!=0)ONE=one[0]; else ONE=one[1]; A[one[0]+one[1]-ONE]=P; for(int i:test)B[i]=ask(ONE,i); answer(); }