Codeforces 448D: Multiplication Table(二分+数学)
2016-07-28 00:17
447 查看
D. Multiplication Table
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Examples
input
output
input
output
input
output
Note
A 2 × 3 multiplication table looks like this:
题目大意:给你一个n*m的乘法表,问这个乘法表中第k大的数是几。
解题思路:二分,判断mid在表中第几大,然后缩短左右区间。怎么判断mid在表中第几大?
看这个例子:1 2 3 4 5 6
2 4 6 8 10 123 6 9 12 15 18 比如看10在这个表中第几大,第一行取6(min(列数,10/行数)),第二行取4(min(列数,10/行数)),第三行取3(min(列数,10/行数))。
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
#define LL __int64
LL n,m,k;
bool judge(LL x)
{
LL sum=0;
for(LL i=1;i<=n;i++)//判断x在表中第几大
{
sum=sum+min(m,x/i);
}
if(sum>=k)
return true;
else
return false;
}
int main()
{
scanf("%I64d %I64d %I64d",&n,&m,&k);
LL l=1,r=n*m;
LL mid;
LL ans;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid))
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%I64d\n",ans);
return 0;
}
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Examples
input
2 2 2
output
2
input
2 3 4
output
3
input
1 10 5
output
5
Note
A 2 × 3 multiplication table looks like this:
1 2 32 4 6
题目大意:给你一个n*m的乘法表,问这个乘法表中第k大的数是几。
解题思路:二分,判断mid在表中第几大,然后缩短左右区间。怎么判断mid在表中第几大?
看这个例子:1 2 3 4 5 6
2 4 6 8 10 123 6 9 12 15 18 比如看10在这个表中第几大,第一行取6(min(列数,10/行数)),第二行取4(min(列数,10/行数)),第三行取3(min(列数,10/行数))。
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
#define LL __int64
LL n,m,k;
bool judge(LL x)
{
LL sum=0;
for(LL i=1;i<=n;i++)//判断x在表中第几大
{
sum=sum+min(m,x/i);
}
if(sum>=k)
return true;
else
return false;
}
int main()
{
scanf("%I64d %I64d %I64d",&n,&m,&k);
LL l=1,r=n*m;
LL mid;
LL ans;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid))
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%I64d\n",ans);
return 0;
}
相关文章推荐
- 【经验总结】编写JavaScript代码时应遵循的14条规律
- 为什么我们不能坚持到底?
- nVIDIA显卡命名规律
- 人才成长有其自身的规律
- 快速排序里的学问:从猜数字开始
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- Search Insert Position,Search for a Range,Pow(x, n),Sqrt(x)
- Find Minimum in Rotated Sorted Array II
- [LeetCode] Sqrt(x)
- [LeetCode] Pow(x, n)
- [LeetCode] Search Insert Position
- [LeetCode] Search for a Range
- [LeetCode] Search in Rotated Sorted Array
- PAT 1057 Stack (30)
- int sqrt(int x)
- Pow(x, n)
- Find Minimum in Rotated Sorted Array
- Divide Two Integers
- 信息竞赛学习笔记:POJ3579中位数(二分)
- acm解题报告 HDU 2141 Can you find it?