CF359D Pair of Numbers

原题

翻译

感谢xjk提供,%%%

先说一个带log的做法

首先,区间满足条件的要求即为mini=lrai=gcdi=lrai,这是显然的(我甚至想错了QwQ)

我们考虑固定住这个区间的最小值x,我们发现假如一个区间[L,R]满足条件,则[L,R]的子区间[l,r]必然满足条件。这样我们就证明了区间长度是有单调性的。(注意这里我并不是真的让钦定一个最小值x,这里这一步只是证明了长度有单调性)

因此我们考虑二分长度答案,接下来的问题就变成了判断区间[ix,i]gcd是否等于min,我们直接用st表即可实现

最终复杂度O(n(logn+logA)),这个复杂度的来源参考这里


然后我们考虑不带log的做法

我们考虑固定住这个区间的最小值x,我们发现假如一个区间[L,R]满足条件,则[L,R]的子区间[l,r]必然满足条件。这样我们就证明了区间长度是有单调性的。

既然我们都想了固定区间最小值x,那我们为什么不直接找到x向左向右延申时能延申到的最远距离呢?

因此我们考虑设li,ri分别表示从i开始,保证区间[li,i][i,ri]中所有数都能被ai整除的最小li和最大ri。因此最终答案即为rili

因此我们考虑怎么求出liri,暴力的,我们可以考虑二分+st表找gcd的方法,但这并不优秀

我们能够发现一个性质:如果一个数ai能整除一个区间[l,r],则ai的因数一定可以整除区间[l,r](这不废话吗)

因此我们考虑用kmp的思路:初始赋值li=i,如果ali1|ai,则我们让lilli1

ri同理,注意最后统计答案时判断重复的区间即可

最终复杂度O(n)

posted @   FOX_konata  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示