1 条题解

  • 0
    @ 2024-3-20 21:48:32

    NNMM 很大,时限1秒,就连 O(n)O(n) 都会超时,所以我们考虑用二分答案 O(logn)O(\log n) 做。

    我们设 l=min(N,M)l=\min(N,M)r=r=LLONG_MAX,如果在 mid\le mid 的数中仅能被N,M中的一个数整除的正整数的个数 K\ge K,那么我们执行r=mid-1;,否则执行l=mid+1。二分结束后,答案为 ll

    AC code

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll n,m,k,lcm;
    bool check(ll x){
        ll a=x/n,b=x/m,c=2*(x/lcm),p=a+b-c; // 容斥原理
        if(p>=k)
            return 1;
        return 0;
    }
    ll bf(){
        ll l=min(n,m),mid,r=LLONG_MAX;
        while(l<=r){
            mid=l+r>>1; // 等价于mid=(l+r)/2,但是位运算会稍快一些
            if(check(mid))
                r=mid-1;
            else
                l=mid+1;
        }
        return l;
    }
    int main(){
        scanf("%lld%lld%lld",&n,&m,&k);
        lcm=n/__gcd(n,m)*m; // 尽量不要写成n*m/__gcd(n,m),避免n*m爆long long
        printf("%lld",bf());
        return 0;
    }
    
    • 1

    信息

    ID
    691
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    (无)
    递交数
    101
    已通过
    45
    上传者