观察到数据范围很大,不能暴力找

既然说了找到第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;
}