观察到数据范围很大,不能暴力找
既然说了找到第k小,我们就想到一个高效率的查找:二分查找
如何计算每一行中小于k的个数呢
首先一行至多m个,根据题目公式i*j,我们假定找到的数为mid,有i*j<=mid
也就是j<=mid/i;
对每一行统计,得到最终结果并且更新答案就好了
int main(){
ll n,m,k;cin>>n>>m>>k;
ll l=1,r=n*m;
ll ans=n*m;
while(l<=r){
ll mid=(l+r)/2;
ll cnt=0;
for(ll i=1;i<=n;i++){
cnt+=min(m,mid/i);
}
if(cnt>=k)ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
}

京公网安备 11010502036488号