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 nm 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 test(s)
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 3
2 4 6

唉这么水的题竟然final test能wa

题意是已知一个固定的矩阵,其中第i行第j列是i*j,然后问在n*m的这样的矩阵中第k大是多少

首先矩阵是固定的,矩阵中数据的规模是2500e。这样的大小对于一般递推太大了些

但是二分+判定的做法还是很好想的

我们每次二分一个可能的第k大数,然后第i行所有小于等于它的数的个数是min(mid/i,m)(因为尽管一排中可能最多有mid/i个数,但是题目已经限定是n*m,直接加mid/i显然不对,我就是这里一开始第五个点wa),用这样的办法统计出所有小于它的数,就很好判定了

但是仅仅是这样还是不行。所以我final test wa了。为什么不行呢?注意到矩阵中并不包含所有正整数,并且显然除了第一行能凑出1到n、第一列可以凑出1到m之外,只有合数可以存在于矩阵中。但是由于二分一旦找到sum加起来等于k的时候就退出,于是会出现这样斯巴达的情况:

对于3*3的矩阵,我们求第8大:

1 2 3

2 4 6

3 6 9

我们二分1到9

第一次:mid=5,sum=6

第二次:mid=7,sum=8

此时sum=k,就应该退出了。但是显然7没有出现在矩阵中!所以问题出现了:有时会二分到不在矩阵中的数。

怎么处理呢?

我们在二分的时候加一个prime()函数,用来判定质数。如果mid<=n或者mid<=m或者mid是合数的时候,它才可能出现在矩阵中。

那么每次做prime()效率是sqrt(n*m)就是50w级的,每行搜过去更新sum是O(m)也是50w的,最多二分log(2500e)大概3、40次,是不会爆的

#include<bits/stdc++.h>
#include<iostream>
#define LL long long
using namespace std;
LL n,m,k,l,r,ans;
inline bool prime(LL x)
{
if (x<2) return 0;
for (int i=2;i*i<=x;i++)
if (x%i) return 0;
return 1;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
l=1;r=m*n;
while (l<=r)
{
LL mid=(l+r)>>1,sum=0;
bool mark=mid<=n||mid<=m||prime(mid);
for (int j=1;j<=n;j++)
{
sum+=min(mid/j,m);
}
if (sum==k&&mark)
{
printf("%lld",mid);
return 0;
}
else
{
if (sum<k) l=mid+1;
else
{
r=mid-1;
ans=mid;
}
}
}
printf("%lld",ans);
}

cf448D Multiplication Table的更多相关文章

  1. 洛谷 CF448D Multiplication Table

    目录 题目 思路 \(Code\) 题目 CF448D Multiplication Table 思路 二分答案.这个矩阵的每一排都是递增的,所以二分\(ans\),去计算有多少个数等于\(ans\) ...

  2. cf448D Multiplication Table 二分

    题目:http://codeforces.com/problemset/problem/448/D 题意:给出n,m,k,即在一个n*m的二维数组中找第k大的数,第i行第j列的数的值为i*j. 思路: ...

  3. hdu4951 Multiplication table (乘法表的奥秘)

    http://acm.hdu.edu.cn/showproblem.php?pid=4951 2014多校 第八题 1008 2014 Multi-University Training Contes ...

  4. Codeforces Codeforces Round #319 (Div. 2) A. Multiplication Table 水题

    A. Multiplication Table Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/57 ...

  5. Codeforces Round #256 (Div. 2) D. Multiplication Table(二进制搜索)

    转载请注明出处:viewmode=contents" target="_blank">http://blog.csdn.net/u012860063?viewmod ...

  6. Codeforces Round #256 (Div. 2) D. Multiplication Table 二分法

     D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes input st ...

  7. Codeforces 448 D. Multiplication Table

    二分法判断答案 D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes inp ...

  8. Codeforces 448 D. Multiplication Table 二分

    题目链接:D. Multiplication Table 题意: 给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m). 题解: n ...

  9. [LeetCode] Kth Smallest Number in Multiplication Table 乘法表中的第K小的数字

    Nearly every one have used the Multiplication Table. But could you find out the k-th smallest number ...

随机推荐

  1. EBS Workfow常用表

    1.Workflow Definition Tables WF_ITEM_TYPES WF_ACTIVITIES WF_MESSAGES WF_ITEM_ATTRIBUTES WF_ACTIVITY_ ...

  2. linux系统编程之进程(四):进程退出exit,_exit区别即atexit函数(转载)

    一,进程终止有5种方式: 正常退出: 从main函数返回 调用exit 调用_exit 异常退出: 调用abort 由信号终止 二,exit和_exit区别: 关于_exit(): #include ...

  3. cf445B DZY Loves Chemistry

    B. DZY Loves Chemistry time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. linux下,FTP服务相关

    虚拟机上安装完CentOS 6.5后,使用FTP工具(FlashFXP)来上传文件到虚拟机的linux,结果发现连接不上.现在解决了,解决方法总结一下: 1.先检查有没有安装ftp.好像包括两个部分, ...

  5. map循环遍历删除

    typedef map<string,int> MapFileList; int main() { MapFileList m_SingleList; m_SingleList.inser ...

  6. Javascript: 截取字符串多出来并用省略号[...]显示

    /背景知识/ substring 方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引 参数描述 start 必需.一个非负的整数 ...

  7. Unity 对象池的使用

    在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的 ...

  8. Samba的ADS域模式和RPC域模式

    对于Samba服务器,有两种域安全模式,加入到Windows 2000或者Windows 2003域控制器(DC‘s)控制的域中: RPC 模式 RPC(远程过程调用)模式的域成员是"NT4 ...

  9. DotNet程序汉化过程--SnippetCompiler准确定位

    开篇前言 上一篇简单介绍了一下怎么汉化.Net程序,但那也仅仅是最基础的工作,要想汉化好一款软件基础我们得做扎实了,但是对于一些需要技巧的也不能不会啊,这一篇就介绍一下怎么准确定位字符串. 主要使用工 ...

  10. IEquatable(T) interface in .Net

    原文:http://weblogs.asp.net/pawanmishra/iequatable-t-interface-in-net 泛型方法: public static bool AreEqua ...