GCD Queries

GCD Queries

交互题。

发现一个结论:

对于三个数 \(a,b,c\),我们询问 \(ga=\gcd(a,c),gb=\gcd(b,c)\)

  • \(ga=gb\),则 \(c\not =0\)
  • \(ga>gb\),则 \(b\not = 0\)
  • \(ga<gb\),则 \(a\not = 0\)

也就是说,进行两次询问可以排除掉一个位置,那么我们一共只需要进行 \(2(n-2)\) 次询问。

#include<bits/stdc++.h>
// #define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
using namespace std;
typedef long long ll;
const int N=2e4+5;
int n;
int a[N];
int t;
int main(){
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("my.out","w",stdout);
    #endif
    cin>>t;
    while(t--){
        cin>>n;
        int x=1,y=2,gx,gy;
        rep(i,3,n){
            cout<<"? "<<x<<' '<<i<<endl;
            cin>>gx;
            cout<<"? "<<y<<' '<<i<<endl;
            cin>>gy;
            if(gx>gy) y=i;
            else if(gx<gy) x=i;
        }
        cout<<"! "<<x<<' '<<y<<endl;
        int op;
        cin>>op;
        if(op==-1) return 0;
    }
}
posted @ 2024-09-10 22:04  liyixin  阅读(5)  评论(0编辑  收藏  举报