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 题解的更多相关文章
- CF 1114 E. Arithmetic Progression
E. Arithmetic Progression 链接 题意: 交互题. 有一个等差序列,现已打乱顺序,最多询问60次来确定首项和公差.每次可以询问是否有严格大于x的数,和查看一个位置的数. 分析: ...
- POJ3495 Bitwise XOR of Arithmetic Progression
Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 772 Accepted: 175 Description Write ...
- 等差数列Arithmetic Progressions题解(USACO1.4)
Arithmetic Progressions USACO1.4 An arithmetic progression is a sequence of the form a, a+b, a+2b, . ...
- Dirichlet's Theorem on Arithmetic Progression
poj3006 Dirichlet's Theorem on Arithmetic Progressions 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. ...
- CF1114E Arithmetic Progression(交互题,二分,随机算法)
既然是在CF上AC的第一道交互题,而且正是这场比赛让我升紫了,所以十分值得纪念. 题目链接:CF原网 题目大意:交互题. 有一个长度为 $n$ 的序列 $a$,保证它从小到大排序后是个等差数列.你不知 ...
- Codeforces 1114E - Arithmetic Progression - [二分+随机数]
题目链接:http://codeforces.com/problemset/problem/1114/E 题意: 交互题,有一个 $n$ 个整数的打乱顺序后的等差数列 $a[1 \sim n]$,保证 ...
- CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression
题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...
- 【Codeforces 382C】Arithmetic Progression
[链接] 我是链接,点我呀:) [题意] 让你在n个数字中再加入一个数字 使得这n+1个数字排序之后 相邻两个数字的差都相同 [题解] 注意相邻为0的情况 这种情况 只有全都相同才行 只有一种情况 然 ...
- Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression (暴力)
题意:有一个长度为\(n\)的序列,可以对所有元素++或--,求最少的操作次数,如果无论如何都不能构成,则输出\(-1\). 题解:一个等差数列一定由首项\(a_{1}\)和公差\(d\)来决定,而这 ...
- 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 ...
随机推荐
- go网络编程(一)
[B站最深度的Golang学习到实战 up主强力推荐] https://www.bilibili.com/video/BV1TK4y1a7ex/?p=101&share_source=copy ...
- Git的基本操作(CUDR)及分支
## 安装 到Git官网下载,网站地址:https://git-scm.com/downloads 需要从网上下载一个,然后进行默认安装即可.安装完成后,在开始菜单里面找到 "Git --& ...
- C++图像处理函数及程序(一)
C++开源项目: Boost.GIL:通用图像库 CImg :用于图像处理的小型开源C++工具包 CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JP ...
- Go 语言 for-range 的两个坑,你踩过吗?
坑一:迭代时协程引用索引和值 先看看下面的例子,你知道最终输出的结果是什么吗? package main import ( "fmt" "time" ) fun ...
- 输入平方米的三种方式㎡ m2 m²
如何在Word中输入平方米字符? 第1种方法 Win10自带输入法,输入"平方米",默认第5个就出来了㎡,也可以直接复制使用. 这种方式最直接,字母m和右上角的2是1个字符,所以不 ...
- ansible 的特点
ansible的特点 基于Python语言实现 模块化,调用特定的模块,完成特定任务 部署简单,基于python和SSH(默认已安装),yum install 即可,不需要客户端 安全,基于OpenS ...
- iframe与主窗口通信
1. 引言 <iframe> 元素是 HTML 中的一个标签,用于在当前页面中嵌入另一个页面 使用 <iframe> 可以实现以下功能: 嵌入其他网页:可以将其他网页嵌入到当前 ...
- 内网渗透大杀器fscan
fscan简介 一款内网综合扫描工具,方便一键自动化.全方位漏扫扫描.支持主机存活探测.端口扫描.常见服务的爆破.ms17010.redis批量写公钥.计划任务反弹shell.读取win网卡信息.we ...
- python-gitlab 一个简单demo
背景 需要收集git仓库信息到数据库供前端展示 包括:仓库信息.仓库所有者.成员列表.提交信息.活跃情况等 需要定时启动.灵活触发 实现简介 使用gitlab v4 restful 接口 使用pyth ...
- 【青少年CTF】Crypto-easy 题解小集合
Crypto-easy 1.BASE 拿到附件用cyberchef自动解码得到flag 2.basic-crypto 拿到附件发现是一串01的数字,这时候想到二进制转换 然后base64在线解码 接着 ...