首页 > 其他分享 >Arithmetic Progression 题解

Arithmetic Progression 题解

时间:2023-08-24 20:23:46浏览次数:40  
标签:Progression int 题解 询问 include Arithmetic out

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;
}

标签:Progression,int,题解,询问,include,Arithmetic,out
From: https://www.cnblogs.com/TKXZ133/p/17655074.html

相关文章

  • CF1850E Cardboard for Pictures 题解
    前言一个月前的一场悲剧qwq传送门没事干写的qwq热乎着的一道题,昨晚上刚考完,然而这是一场悲剧。。。。题解题目大意给定\(a_1~a_n\)和\(c\),求\((a_1+2\timesw)^2+(a_2+2\timesw)^2+...+(a_n+2\timesw)^2=c\)时\(w\)的最小值解析我们来化简一下这个式子:\((a_......
  • NOIP 2023 周赛 3 题解
    A-Permutationsummarization构造一个\(1\dotsn\)的排列使\(\prod\limits_{i=1}^n\operatorname{lcm}(p_i,p_{(i\bmodn)+1})\)最大。solution不难发现上式最大为\(\prod\limits_{i=1}^ni^2\),即让所有\(\operatorname{lcm}(x,y)=x\timesy\),那么只要使相邻两个数互质......
  • 题解 ABC309Ex【Simple Path Counting Problem】
    好好玩的题。设普通生成函数\(F_i\),其中\([z^k]F_i\)表示从所有起点走到\((i,k)\)的方案数。特别地,\([z^k]F_1=\sum\limits_{a\inA}[a=k]\)。注意到\(F_i=(z^{-1}+1+z)F_{i-1}\)几乎成立,但是在\([z^1]F_i\)和\([z^M]F_i\)处不成立。尝试对\(F_i\)进行改造:\[[z^k......
  • 国标GB2818视频平台EasyGBS国标平台与车机设备连接显示未连接成功的问题解决方法
    EasyGBS平台可提供流媒体接入、处理、转发等服务,支持内网、公网的监控设备通过国标GB/T28181协议进行视频监控直播。平台兼容性强,只要设备支持国标GB28181协议,均能快速接入EasyGBS,实现视频的监控直播、视频录像、语音对讲、云存储、检索及回放、告警、级联等。​......
  • 国标视频云服务EasyGBS国标平台与海康4200平台级联后不能播放的问题解决方法
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等......
  • CodeForces1741G-Kirill and Company题解
    \(\large\text{CodeForces1741G-KirillandCompany题解}\)题面传送门(有翻译(由黄巨佬提供))思路预处理因为\(k\)很小,所以可以先bfs预处理出家在\(i(2\lei\len)\)的人能捎带上哪些集合的人,在表示集合时用一个\(0\)到\(2^k-1\)的整数\(j\)表示,若\(j\)在二进质下的......
  • Codeforces Round #849 (Div. 4) 题解
    第一次打$\text{Div.4}$,感觉体验还行,差一题AK。##A直接使用if语句判断某个字符是否在字符串$\text{codeforces}$中出现过,幼儿园小朋友都会做。时间复杂度$\mathcal{O}(T)$,空间复杂度$\text{O}(1)$。ACCode##B用两个变量$x,y$记录当前走到哪里。若出现过$x=1,y=1$的......
  • CF36D New Game with a Chess Piece 题解
    前言:都大半年没在洛谷上提交过题解了。SPOJ上有双倍经验,题号为SP7602。我看题解区的大佬们有的正经用博弈论做,有的打表,但是感觉没有讲得很形象,这篇题解将生动讲述打表做法,同时为了让大家在感性理解后,还可以理性理解,会附上证明(这部分参考了别的题解)。正文:Step1:打表找规律......
  • CF54C First Digit Law 题解
    题目传送门\(Solution\):一个比较简单的数位dp处理技巧加上一个暴力的dp。设\(p_i\)为区间\([l_i,r_i]\)中出现\(1\)开头的数的概率。考虑\(solve(x)\)函数为求出\([1,x]\)中开头为\(1\)的个数。显然低于\(x\)的位数的数是全部能取到的,这时候开头为\(1\)......
  • 题解 数数
    题目链接可持久化平衡树看上去很行的样子,但是我不会啊。。。先来考虑一个简化版的问题:求区间\([1,n]\)中\(\leH_i\)的元素个数。这显然是好做的,用权值树状数组就行。回到本题,显然:询问区间\([l,r]\)中\(\leH_i\)的个数,等价与区间\([1,r]\)的答案减去区间\([1,l-1]......