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;
}
}
本文来自博客园,作者:liyixin,转载请注明原文链接:https://www.cnblogs.com/liyixin0514/p/18407315