题意: 解法: 求从大到小第k大=求从小到大第n*m-k+1大. 二分答案mid,判断<=mid的是否有至少k个即可, [1,n]枚举i,满足i*j<=mid的j的取值范围为[1,min(m,mid/i)], 求和之后判断是否>=k即可check. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e5+5; int n,m,k; int check(int mid){//<=mid的是否有k个 int ans=0; for(int i=1;i<=n;i++){ int t=mid/i; ans+=min(t,m); } return ans>=k; } void solve(){ cin>>n>>m>>k; k=n*m-k+1; int l=1,r=n*m; int ans=1; while(l<=r){ int mid=(l+r)/2; if(check(mid)){ ans=mid,r=mid-1; }else{ l=mid+1; } } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }