Arithmetic Progression

题目大意

存在一个打乱了顺序的等差数列 \(a\),你可以询问不超过 \(60\) 次,每次可以以以下两种方式之一进行询问:

  • 查询 \(a\) 中是否有严格大于 \(x\) 的数。

  • 查询 \(a_i\) 的值。

你需要求出这个等差数列的首项和公差。

思路分析

比较有意思的题。

看到第一种询问,首先想到二分,我们可以用 \(O(\log V)\) 次询问查询出 \(a\) 中的最大值。

那么公差怎么求呢?

考虑随机化,我们在 \(a\) 中随机询问若干个位置的值(把剩下的询问次数全部询问掉),然后将这些得到的值排序,求相邻两数之间的差,再求出所有差的最大公约数作为 \(a\) 的公差,这样有极大概率是对的。

证明可以参考官方题解,用莫反可以得出出错的概率约为 \(1.86185\times 10^{-9}\)。证明我也不会。

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <random>
#include <chrono>
#include <cmath> using namespace std;
const int V=1000000000,N=100,M=60; int n,times,tot,in1;
int a[N],d[N]; int gcd(int a,int b){
return b?gcd(b,a%b):a;
} std::mt19937 defaultRNG(std::chrono::steady_clock::now().time_since_epoch().count());
int defaultRandInt(int l,int r){
int out=defaultRNG()%(r-l+1)+l;
return out>=l?out:out+r-l+1;
}
int (*randint)(int,int)=defaultRandInt; int main(){
scanf("%d",&n);
int l=0,r=V,ans=0;
while(l<=r){
int mid=(l+r)>>1;
cout<<"> "<<mid<<endl;
times++;
scanf("%d",&in1);
if(in1) l=mid+1,ans=mid;
else r=mid-1;
}
for(int i=times;i<M;i++){
cout<<"? "<<randint(1,n)<<endl;
scanf("%d",&a[++tot]);
}
sort(a+1,a+tot+1);
for(int i=2;i<=tot;i++)
d[i-1]=a[i]-a[i-1];
int D=d[1];
for(int i=2;i<tot;i++)
D=gcd(D,d[i]);
cout<<"! "<<ans+1-D*(n-1)<<' '<<D<<endl;
return 0;
}

Arithmetic Progression 题解的更多相关文章

  1. CF 1114 E. Arithmetic Progression

    E. Arithmetic Progression 链接 题意: 交互题. 有一个等差序列,现已打乱顺序,最多询问60次来确定首项和公差.每次可以询问是否有严格大于x的数,和查看一个位置的数. 分析: ...

  2. POJ3495 Bitwise XOR of Arithmetic Progression

    Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 772   Accepted: 175 Description Write ...

  3. 等差数列Arithmetic Progressions题解(USACO1.4)

    Arithmetic Progressions USACO1.4 An arithmetic progression is a sequence of the form a, a+b, a+2b, . ...

  4. Dirichlet's Theorem on Arithmetic Progression

    poj3006 Dirichlet's Theorem on Arithmetic Progressions 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. ...

  5. CF1114E Arithmetic Progression(交互题,二分,随机算法)

    既然是在CF上AC的第一道交互题,而且正是这场比赛让我升紫了,所以十分值得纪念. 题目链接:CF原网 题目大意:交互题. 有一个长度为 $n$ 的序列 $a$,保证它从小到大排序后是个等差数列.你不知 ...

  6. Codeforces 1114E - Arithmetic Progression - [二分+随机数]

    题目链接:http://codeforces.com/problemset/problem/1114/E 题意: 交互题,有一个 $n$ 个整数的打乱顺序后的等差数列 $a[1 \sim n]$,保证 ...

  7. CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression

    题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...

  8. 【Codeforces 382C】Arithmetic Progression

    [链接] 我是链接,点我呀:) [题意] 让你在n个数字中再加入一个数字 使得这n+1个数字排序之后 相邻两个数字的差都相同 [题解] 注意相邻为0的情况 这种情况 只有全都相同才行 只有一种情况 然 ...

  9. Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression (暴力)

    题意:有一个长度为\(n\)的序列,可以对所有元素++或--,求最少的操作次数,如果无论如何都不能构成,则输出\(-1\). 题解:一个等差数列一定由首项\(a_{1}\)和公差\(d\)来决定,而这 ...

  10. Find Missing Term in Arithmetic Progression 等差数列缺失项

    查找等差数列中的缺失项. e.g.Input: arr[] = {2, 4, 8, 10, 12, 14} Output: 6 Input: arr[] = {1, 6, 11, 16, 21, 31 ...

随机推荐

  1. MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

    更改缓冲区(Change Buffer)是一种特殊的数据结构,用于缓存不在缓冲池中的二级索引(secondary index)页的更改.可能来自于INSERT.UPDATE或DELETE操作(数据操作 ...

  2. Google Colab:云端的Python编程神器

    Google Colab,全名Google Colaboratory,是Google Research团队开发的一款云端编程工具,它允许任何人通过浏览器编写和执行Python代码.Colab尤其适合机 ...

  3. ZEGO即构科技荣获36氪【WISE2020中国新经济之王最具影响力企业】

    12月8-10日,36氪重磅新经济峰会WISE2020新经济之王大会将在北京举办.近日,2020新经济之王--中国最具影响力企业榜单陆续发布,全球云通讯服务商即构科技,凭借在企业服务领域硬核出色的技术 ...

  4. Android进阶-NDK技术

    一.介绍 1.什么是ndk技术? 在学习ndk技术前,我们需要先了解一下JNI(Java Native Interface)技术,JNI技术是一种实现Java代码和C/C++代码之间交互的技术,它提供 ...

  5. 家人们,我把B站首页写出来了!!!

    在学习HTML5和CSS3的过程中,总是感觉没有一个完全自己做出来的页面,一直在各大网站上面寻找合适的适合自己去仿写的页面代码,奈何找了很久都没有找到,在CSDN上找的各种什么电商页面,小米商城页面之 ...

  6. 私网部署DNS(BIND)笔记

    准备工作 下载 yum install -y bind bind-utils包含dig.nslookup等调试命令,非必须. yum install -y bind-utils 防火墙 firewal ...

  7. gulp来处理html、css、js资源啦

    gulp 一般用于处理自动化任务,默认情况无法处理模块化,也不会用于大型项目,但它可以使用各种插件来编译 html.css.js 等资源. 不清楚如何使用 gulp 开启任务的朋友可以参考 gulp使 ...

  8. react中使用动画 react-transition-group

    在React中通过react-transition-group使用过渡.动画,首先要有CSS3中的过渡和动画的相关知识储备,可以参考 过渡和2D变换.动画和3d变换. 我们自己通过css设置过渡.动画 ...

  9. [nginx]反向代理grpc

    前言 nginx从1.13.10版本开始提供对gRPC代理的支持.由于grpc基于http2,因此编译nginx时需要添加参数--with-http_v2_module来启用对http2协议的支持. ...

  10. [selenium]相对定位器

    前言 Relative Locators,相对定位器,是Selenium 4引入的一个新的定位器,相对定位器根据源点元素去定位相对位置的其它元素. 相对定位方法其实是基于JavaScript的 get ...