您的位置:首页 > 其它

Codeforces_448D_Multiplication Table(二分答案)

2014-07-19 09:44 507 查看
题型:二分

题意:n*m的乘法表,算出第K大的数

分析:

总是想不到二分答案,唉,真伤感呢。。。

这个题目如果想到二分答案,就很简单了~

二分范围为1到n*m,每次二分出一个值,求出每一行在哪个值之前的数的个数

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define LL __int64
using namespace std;

LL n,m,k;

int main(){

while(~scanf("%I64d%I64d%I64d",&n,&m,&k)){
LL l = 1;
LL r = n*m;
LL mid;
while(l<=r){
bool flag = false;
mid = (l + r) >> 1;

LL num = 0;
for(LL i=1;i<=n;i++){
num += min(mid/i,m);
if(mid%i==0 && mid/i<=m) flag = true;
}

if(num==k && flag){
l = mid;
break;
}

if(num < k){
l = mid+1;
}
else{
r = mid-1;
}
}

printf("%I64d\n",l);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: