链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
\hspace{15pt}小红拿到了正整数 xxx ,她希望你找到一个长度为 kkk 的区间,满足区间内恰好有 nnn 个数是 xxx 的倍数。你能帮帮她吗?
输入描述:
\hspace{15pt}在一行上输入三个整数 n,k,x(1≤n,k,x≤109)n,k,x \left(1\leq n,k,x \leq 10^9\right)n,k,x(1≤n,k,x≤109) 。
输出描述:
\hspace{15pt}如果答案不存在,直接输出 −1-1−1 ;否则,输出两个正整数 l,r(1≤l≤r<2×109; l+k−1=r)l,r \left(1\leq l \leq r < 2 \times 10^9;\ l + k - 1 = r\right)l,r(1≤l≤r<2×109; l+k−1=r) 代表答案。\hspace{15pt}如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
示例1
输入
2 5 3
输出
6 10
说明
\hspace{15pt}在这个样例中,[6,10][6,10][6,10] 区间内恰好有 222 个数是 333 的倍数,符合要 求。
import java.util.Scanner;public class Main {// 创建一个静态的 Scanner 对象用于读取输入static Scanner in = new Scanner(System.in);public static void main(String[] args) {// 读取三个整数 n, k, x//n是要找的数,k是区间长度,x是含的个数long n = in.nextInt(), k = in.nextInt(), x = in.nextInt();// 计算 (k-1)/x 的值,并存储在 pre 变量中long pre = (k - 1) / x;// 如果 pre+1 等于 n,则输出 x 和 x+k-1if (pre + 1 == n) {System.out.println(x + " " + (x + k - 1));} // 如果 pre 等于 n,则输出 x+1 和 x+kelse if (pre == n) {System.out.println((x + 1) + " " + (x + k));} // 否则输出 -1else {System.out.println(-1);}}
}
在公式 pre = (k - 1) / x
中,使用 (k - 1)
而不是 k
是为了确保计算的区间长度和包含的整数个数符合要求。
具体来说,考虑以下情况:
- 区间长度 kk:表示目标区间的长度。
- 包含的整数个数 xx:表示目标区间内需要包含的整数个数。
为什么使用 k - 1k−1?
假设我们有一个长度为 k k 的区间,并且我们希望在这个区间内找到恰好包含 x x 个整数的子区间。为了确保这个条件成立,我们需要计算能够完整包含多少个长度为 x x 的子区间。
示例分析
假设输入为:
复制代码
n = 3, k = 5, x = 2
- 目标区间长度为 5。
- 每个子区间长度为 2。
如果我们直接用 k
来计算:
复制代码
pre = k / x = 5 / 2 = 2.5
这表示我们可以有 2.5 个完整的子区间,但实际只能有 2 个完整的子区间(因为不能有半个子区间)。
为了确保我们只计算完整的子区间,我们需要减去 1:
复制代码
pre = (k - 1) / x = (5 - 1) / 2 = 4 / 2 = 2
这样,pre
的值就正确地反映了可以完整包含的子区间数量。
总结
通过使用 (k - 1)
,我们确保了计算结果只考虑完整的子区间,从而避免了出现不完整的子区间的情况。这样可以更准确地判断是否存在符合条件的区间,并输出正确的结果。