mid 为什么要除以m

来源:8-7 复杂的二分查找(2)

慕仙3261604

2022-02-09

    final int m = lcm(a, b);
    long left = 1, right = ((long) n) *a;

    while(left <= right){
        final long mid = (left + right) >> 1;
        if(mid/a + mid/b - mid/m >= n){//这里的mid除以m的意思?
            right = mid -1;
        }else{
            left = mid + 1; 
        }
    }

    return (int)((right + 1)%1000000007);
写回答

1回答

javaman

2022-02-12

同学, 你好。


mid / x(下取整)表示从1到mid的所有数中有多少个是x的倍数。


那么mid / a + mid / b - mid / m求的是1到mid之间的数中有多少个数是a或者b的倍数。

这里m是a和b的最小公倍数。因为同时是a和b的倍数的数在mid / a 和mid / b中会各被计算一次,所以要把它减掉。


0
0

算法面试刷题课--竞赛命题人带你刷70+中高级题型

只需20小时, Google面试官带你完成Java算法面试准备

539 学习 · 65 问题

查看课程