您的位置:首页 > 其它

CodeForces 448D Multiplication Table (二分 )

2016-07-27 17:06 281 查看
K - Multiplication Table
Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

Bizon the Champion isn't just charming, he also is very smart.

While some of us were learning the multiplication table, Bizon the Champion had fun in his own manner. Bizon the Champion painted ann × m multiplication table, where the element on
the intersection of the i-th row and j-th column equals i·j (the
rows and columns of the table are numbered starting from 1). Then he was asked: what number in the table is the k-th largest number? Bizon the Champion always answered correctly and immediately.
Can you repeat his success?

Consider the given multiplication table. If you write out all n·m numbers from the table in the non-decreasing order, then the k-th
number you write out is called the k-th largest number.

Input

The single line contains integers n, m and k (1 ≤ n, m ≤ 5·105; 1 ≤ k ≤ n·m).

Output

Print the k-th largest number in a n × m multiplication table.

Sample Input

Input
2 2 2


Output
2


Input
2 3 4


Output
3


Input
1 10 5


Output
5


Hint

A 2 × 3 multiplication table looks like this:

1 2 32 4 6

解题思路:

这道题刚开始题意就理解错了。。。。。。最主要的还是找一个数(mid)是排序后的第几几个数;然后二分和k比较;

#include <cstdio>
#include <cstring>
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;

long long n,m,k;

bool ck(long long x)
{
long long nt=0;
for(long long i=1;i<=n;i++)
{
nt+=min(m,x/i);
}
if(nt>=k) return true;
return false;
}

int main()
{
while(scanf("%lld%lld%lld",&n,&m,&k)!=EOF)
{
long long low=1,high=n*m,ans=-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(ck(mid))
{
ans=mid; high=mid-1;
}
else low=mid+1;
}
printf("%lld\n",ans);

}

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