Only one of two(只有两个中的一个)
时间限制:2s 内存限制:1024MB
【原题地址】
所有图片源自Atcoder,题目译文源自脚本Atcoder Better!
【问题描述】
【输入格式】
【输出格式】
【样例1】
【样例输入1】
2 3 5
【样例输出1】
9
【样例说明1】
【样例2】
【样例输入2】
1 2 3
【样例输出2】
5
【样例说明2】
【样例3】
【样例输入3】
100000000 99999999 10000000000
【样例输出3】
500000002500000000
【解题思路】
老汉使用到的是二分查找的解题方式
代码注释有详细过程
【代码】
package ABC341_D_Onlyoneoftwo;
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static StreamTokenizer st = new StreamTokenizer(br);
public static long readLong() throws IOException {
st.nextToken();
return (long) st.nval;
}
/**
* 求最大公因数
*
* @param x
* @param y
* @return x、y的最大公因数
*/
public static long gcd(long x, long y) {
if (x > y) {
long t = x;
x = y;
y = t;
}
if (y % x == 0) {
return x;
}
return gcd(y % x, x);
}
public static void main(String[] args) throws IOException {
long n, m, k, x;
n = readLong();
m = readLong();
k = readLong();
// 求n、m的最大公倍数
x = n * m / gcd(n, m);
long l = 0;
long r = (long) 1e+18;
long mid, y;
while ((l + 1) < r) {
mid = (l + r) / 2;
// 当值为mid时,一共有多少个符合题目条件的数
y = (mid / n) + (mid / m) - 2 * (mid / x);
// 当y<k时答案位于右半区,当y>=k时,答案位于右半区
if (y < k) {
l = mid;
} else {
r = mid;
}
}
// 当答案为y时,也就是y=k,答案被保存在r,且一直不变,输出r即为答案
pw.println(r);
pw.flush();
pw.close();
br.close();
}
}