作者 : Xia Xinyu
日期 : 2021-11-27原题链接
给定一个 n×m 的方格矩阵,每个方格内都有一个整数元素。
其中第 i 行第 j 列的方格中的元素为 i×j(行和列都从 1 开始编号)。
现在,需要你将这 n×m 个整数按照非严格单调递增的顺序一一写出。
请问,你写出的第 k 个整数是多少。
输入格式
一行,三个整数 n,m,k。
输出格式
一行,输出你写出的第 k 个整数。
数据范围
前 6 个测试点满足 1≤n,m≤10。
所有测试点满足 1≤n,m≤5×105,1≤k≤n×m。
输入样例1:
2 2 2
输出样例1:
2
输入样例2:
2 3 4
输出样例2:
3
输入样例3:
1 10 5
输出样例3:
5
import java.util.*;
public class Main{
static long n,m,k;
public static boolean check(long mid){
long cnt = 0; //cnt必须为int类型,否则会溢出
for(int i = 1;i <= n;i ++){
cnt += Math.min(m,mid / i);
}
return cnt >= k;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
n = in.nextLong();
m = in.nextLong();
k = in.nextLong();
long l = 1,r = m * n;
while(l < r){
long mid = (l + r) / 2;
if(check(mid)) r = mid;
else l = mid + 1;
}
System.out.println(r);
}
}
时间复杂度
:O(n*logn) 一层循环+二分
空间复杂度
:O(1)