Atcoder ABC341 D - Only one of two

本文介绍了解决Atcoder编程题目的方法,利用二分查找和最大公因数/最大公倍数计算来确定给定范围内的符合条件的数的数量,最终输出结果。
摘要由CSDN通过智能技术生成

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();
	}
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王老汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值