题目描述
A:只能送给贝茜的数 = 能被y整除的数 - 能被x整除的数 = H/y - H/x
B:只能送给贝蒂的数 = 能被x整除的数 - 能被y整除的数 = H/x - H/y
C:即可以送给贝茜,也可以送给贝蒂的数 = H - 可以被x整除或者可以被y整除的数
= H -(能被y整除的数 + 能被x整除的数 - 同时能被x和y整除的数)
= H - (H/x + H/y - H/x*y)
因为x和y都是质数,所以最小的公倍数 = x*y
最小公倍数 = (a*b)/ 最大公约数
样例
import java.util.Scanner;
public class Main {
static long n, m, x, y;
/*
A:只能送给贝茜的数 = 能被y整除的数 - 能被x整除的数 = H/y - H/x
B:只能送给贝蒂的数 = 能被x整除的数 - 能被y整除的数 = H/x - H/y
C:即可以送给贝茜,也可以送给贝蒂的数 =
H - 即可以被x整除又可以被y整除的数 = H - (H/x + H/y - H/x*y)
因为x和y都是质数,所以最小的公倍数 = x*y
*/
static boolean check(long h) {
long a = h / y - h / x / y;
long b = h / x - h / x / y;
long c = h - h / x - h / y + h / x / y;
long s1 = Math.max(0, n - a), s2 = Math.max(0, m - b);
return s1 + s2 <= c;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextLong();
m = scanner.nextLong();
x = scanner.nextLong();
y = scanner.nextLong();
long l = 1, r = 6000000000L; // 6e9
while (l < r) {
long mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
System.out.println(r);
scanner.close();
}
}
膜佬