题解 | #倍集#

倍集

https://ac.nowcoder.com/acm/problem/21335

这道题看了其他大佬的题解才看出来,首先就是需要让每一个独立的区间内部没有倍数,这可以通过收缩左边界实现。

然后假设全要,这个时候需要的就是找出没有倍数关系的有几个。

我们从开始枚举,我们要满足 ,也就是乘一个倍数过后,仍然小于d。那么可以反解出k。

然后我们又需要让,那么最大的一个数就是,个数就是.

然后类似数论分块那样到下一个倍数k的区间即可。

理解如果有误欢迎大佬指正

import sys
read = sys.stdin.readline
if __name__ == "__main__":
    a,b,c,d = map(int,read().split())
    a = max(a,b // 2 + 1)
    c = max(c,d // 2 + 1)
    res = d - c + 1
    left = a 
    while left <= b:
        # k * left <= d
        k = d // left 
        #k倍为一个区间,找这个区间里面的,也就是[a,b]里面的x,x * k < c  
        right = min(b,(c - 1) // k)
        if left <= right:
            res += right - left + 1
        #类似数论分块,将这一坨都是k倍的跳过了。
        left = d // k + 1
    print(res)
全部评论

相关推荐

03-31 14:46
已编辑
门头沟学院 Web前端
励志成为双港第一ja...:这其实很正常,离的太远了,他认为你不会来,就为了混个面试,而且成本很高,实习生都优先选本地高校。吃了地域的亏,所有很多时候地域可能比院校层次更重要。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-19 10:38
实力求职者:真的绷不住了,第一张霸总人设,第二张求生欲拉满
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务