AT_abc341_d

· · 题解

思路

题目给出的数据范围很大,所以只能考虑二分,这里我们直接二分答案。对于我们二分出的值,可以通过 mid/nmid/m 求出在它以内分别有多少个 nm 的倍数,之后我们减去重复的,剩下的就是这个数的位次。

重复的部分实际上就是 nm 的最小公倍数。

CODE

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>k;
    int x=n*m/(__gcd(n,m));
    int l=0,r=1e18;
    int ans=1e18;
    while(l<=r){
        int mid=(l+r)/2;
        int sum=mid/n+mid/m-mid/x-mid/x;
        if(sum>=k){
            r=mid-1;
            ans=min(ans,mid);
        }
        else {
            l=mid+1;
        }
    }
    cout<<ans;
    return 0;
}