等差数列+随机数——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;    
}
 
 
原文地址:https://www.cnblogs.com/zsben991126/p/10905016.html