等差数列+随机数——cf1114E
先确定上界
然后用查询随机位置的数,求gcd作为公差即可
/* 给定一个size为n的打乱的等差数列 两个询问 ? i 询问第i个数的值 > x 询问大于的值是否存在 可以在30次内问出最大值 再问30个数字,求差的gcd即可 */ #include<bits/stdc++.h> using namespace std; #define ll long long int n; int ask1(int x){//询问是否有比x大的数 int res; printf("> %d\n",x); fflush(stdout); scanf("%d",&res); return res; } int ask2(int i){ int res; printf("? %d\n",i); fflush(stdout); scanf("%d",&res); return res; } int main(){ cin>>n; ll l=0,r=1000000000,Max=0,mid; while(l<=r){ mid=l+r>>1; if(ask1(mid)) Max=mid+1,l=mid+1; else r=mid-1; } ll d=0,la=ask2(1); for(int i=2;i<=25;i++){ int tmp=ask2((la+i)%n+1); d=__gcd(d,abs(la-tmp)); la=tmp; } cout<<"! "<<Max-d*(n-1)<<" "<<d<<endl; }