由于只能是 𝑛n 或 𝑚m 的倍数,那么,用容斥原理可知,当前数应是第 mid / n + mid / m - mid / x * 2
个。为什么减两倍?这是因为不能为 𝑛n 和 𝑚m 的公倍数。
给定正整数 𝑛,𝑚,𝑘n,m,k,求出第 𝑘k 小的满足仅能被 𝑛,𝑚n,m 中的一个数整除的正整数。
1≤𝑛,𝑚≤108,1≤𝑘≤10101≤n,m≤108,1≤k≤1010。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL n, m, k, x;
inline LL check(LL mid) {
LL sum = mid / n + mid / m - mid / x * 2;
return sum < k;
}
int main() {
scanf("%lld%lld%lld", &n, &m, &k);
// if(n < m) swap(n, m);
LL l = 0, r = 5e18;
x = n * m / __gcd(n, m);
while(l <= r) {
LL mid = l + ((r - l) >> 1);
if(check(mid)) l = mid + 1;
else r = mid - 1;
}
printf("%lld", l);
return 0;
}