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?