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. go网络编程(一)

    [B站最深度的Golang学习到实战 up主强力推荐] https://www.bilibili.com/video/BV1TK4y1a7ex/?p=101&share_source=copy ...

  2. Git的基本操作(CUDR)及分支

    ## 安装 到Git官网下载,网站地址:https://git-scm.com/downloads 需要从网上下载一个,然后进行默认安装即可.安装完成后,在开始菜单里面找到 "Git --& ...

  3. C++图像处理函数及程序(一)

    C++开源项目: Boost.GIL:通用图像库 CImg :用于图像处理的小型开源C++工具包 CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JP ...

  4. Go 语言 for-range 的两个坑,你踩过吗?

    坑一:迭代时协程引用索引和值 先看看下面的例子,你知道最终输出的结果是什么吗? package main import ( "fmt" "time" ) fun ...

  5. 输入平方米的三种方式㎡ m2 m²

    如何在Word中输入平方米字符? 第1种方法 Win10自带输入法,输入"平方米",默认第5个就出来了㎡,也可以直接复制使用. 这种方式最直接,字母m和右上角的2是1个字符,所以不 ...

  6. ansible 的特点

    ansible的特点 基于Python语言实现 模块化,调用特定的模块,完成特定任务 部署简单,基于python和SSH(默认已安装),yum install 即可,不需要客户端 安全,基于OpenS ...

  7. iframe与主窗口通信

    1. 引言 <iframe> 元素是 HTML 中的一个标签,用于在当前页面中嵌入另一个页面 使用 <iframe> 可以实现以下功能: 嵌入其他网页:可以将其他网页嵌入到当前 ...

  8. 内网渗透大杀器fscan

    fscan简介 一款内网综合扫描工具,方便一键自动化.全方位漏扫扫描.支持主机存活探测.端口扫描.常见服务的爆破.ms17010.redis批量写公钥.计划任务反弹shell.读取win网卡信息.we ...

  9. python-gitlab 一个简单demo

    背景 需要收集git仓库信息到数据库供前端展示 包括:仓库信息.仓库所有者.成员列表.提交信息.活跃情况等 需要定时启动.灵活触发 实现简介 使用gitlab v4 restful 接口 使用pyth ...

  10. 【青少年CTF】Crypto-easy 题解小集合

    Crypto-easy 1.BASE 拿到附件用cyberchef自动解码得到flag 2.basic-crypto 拿到附件发现是一串01的数字,这时候想到二进制转换 然后base64在线解码 接着 ...