Codeforces Round #538 (Div. 2) E 随机数生成

Posted virtu0s0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #538 (Div. 2) E 随机数生成相关的知识,希望对你有一定的参考价值。

https://codeforces.com/contest/1114/problem/E

题意

交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题
1. 数列中有没有数比x大
2. 数列的第i项是什么
最多只能问60次

题解

  • 首先用第一种问题+二分问出数列最大的数是多少,最多二十次
  • 然后用第二种问题尽可能分散的询问第i项,然后将问出的数组排序,对相邻两个数的差求gcd

随机数生成链接
https://codeforces.com/blog/entry/61587
https://codeforces.com/blog/entry/61675

#include<bits/stdc++.h>
#define M 1000000
#define P 23333
#define X 23
#define ll long long 
using namespace std;
int vi[M+5];
ll n,cnt,x,sz,a[100],l,r,mid,gcd,i,mul;
int main(){
    cin>>n;
    mul+=P;x=((ll)rand()*X%n+mul)%n+1;vi[x]=1;
    cout<<"? "<<x<<endl;cnt++;cout.flush();
    cin>>a[sz++];
    l=a[0];r=1e9;
    while(l<r){
        mid=(l+r)/2;
        cout<<"> "<<mid<<endl;cnt++;cout.flush();
        cin>>x;
        if(x)l=mid+1;
        else r=mid;
    }
    for(;cnt<=60;cnt++){
        if(sz==n)break;
        mul+=P;
        x=((ll)rand()*X%n+mul)%n+1;
        while(vi[x]){
            mul+=P;
            x=((ll)rand()*X%n+mul)%n+1;
        }
        vi[x]=1;
        cout<<"? "<<x<<endl;cnt++;cout.flush();
        cin>>a[sz++];
    }
    sort(a,a+sz);
    gcd=a[1]-a[0];
    for(i=2;i<sz;i++){
        gcd=__gcd(gcd,a[i]-a[i-1]);
    }
    cout<<"! "<<l-(n-1)*gcd<<" "<<gcd<<endl;
    cout.flush();
}   

以上是关于Codeforces Round #538 (Div. 2) E 随机数生成的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #538 (Div. 2) (CF1114)

CodeForces Contest #1114: Round #538 (Div. 2)

[比赛] Codeforces Round #538 (Div. 2) solution (贪心,数学其他,二分,线段树)

Codeforces Round #538 (Div. 2) D. Flood Fill 区间dp || LPS (最长回文序列)

Codeforces Round #538 (Div. 2) E 随机数生成

[codeforces]Round #538 (Div. 2) F. Please, another Queries on Array?