• 等差数列+随机数——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;    
    }
     
     
  • 相关阅读:
    jQuery 从无到有.一天完成.
    JavaScript从无到有(一天完成)
    HTML(第一篇)
    前端认识
    三元表达式,列表推导是,字典生成式
    ORM之youku项目小练习(上)
    高逼格壁纸
    pymysql 基操全套
    怎么学好编程?
    mysql 事务
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10905016.html
Copyright © 2020-2023  润新知