cf448D Multiplication Table
1 second
256 megabytes
standard input
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.
The single line contains integers n, m and k (1 ≤ n, m ≤ 5·105; 1 ≤ k ≤ n·m).
Print the k-th largest number in a n × m multiplication
table.
2 2 2
2
2 3 4
3
1 10 5
5
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的更多相关文章
- 洛谷 CF448D Multiplication Table
目录 题目 思路 \(Code\) 题目 CF448D Multiplication Table 思路 二分答案.这个矩阵的每一排都是递增的,所以二分\(ans\),去计算有多少个数等于\(ans\) ...
- cf448D Multiplication Table 二分
题目:http://codeforces.com/problemset/problem/448/D 题意:给出n,m,k,即在一个n*m的二维数组中找第k大的数,第i行第j列的数的值为i*j. 思路: ...
- hdu4951 Multiplication table (乘法表的奥秘)
http://acm.hdu.edu.cn/showproblem.php?pid=4951 2014多校 第八题 1008 2014 Multi-University Training Contes ...
- 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 ...
- Codeforces Round #256 (Div. 2) D. Multiplication Table(二进制搜索)
转载请注明出处:viewmode=contents" target="_blank">http://blog.csdn.net/u012860063?viewmod ...
- 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 ...
- Codeforces 448 D. Multiplication Table
二分法判断答案 D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes inp ...
- Codeforces 448 D. Multiplication Table 二分
题目链接:D. Multiplication Table 题意: 给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m). 题解: n ...
- [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 ...
随机推荐
- 个性化定制——物流app
众所周知,在互联网不断迈进的大环境下,各行各业都不免在这大潮下纷纷卷入.人们早已不再满足于传统行业,即便是所谓的新兴行业所带来的体验,他们更多的希望能够在便捷的基础上获取更加个性化的服务,个性化服务在 ...
- window环境下安装 pip 工具 【pip为Python的扩展管理工具】
Python有一些扩展管理工具,例如easy_install和pip工具,我推荐各位使用pip工具,因为pip工具具有很好的安装和卸载体验. 我们首先需要打开pip的官方网站, 下载必要的文件包,然后 ...
- Linux中部署JAVA程序
JAVA程序在开发完成后,需要部署到服务器,如果是WEB项目,需要部署到WEB服务器,否则部署到应用服务器. JAVA是跨平台的编程语言,服务器的操作系统可以是Windows.Linux或者其它,下面 ...
- day49
几天没写了 这几天比较麻木呢 各种课程的再看 想买一直不舍得money 今天下定决心买了 这样我也静下心好好备战把 一天背的东西好多 政治和作文也是背了就忘记 尽力把 今天的买的课很悬乎 就不在这说了 ...
- 去掉MySQL字段中的空格
mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例: SQL Co ...
- Oracle的sql语句中case关键字的用法 & 单双引号的使用
关于sql中单引号和双引号的使用,来一点说明: 1. 查询列的别名如果含有汉字或者特殊字符(如以'_'开头),需要用双引号引起来.而且只能用双引号,单引号是不可以的. 2. 如果想让某列返回固定的值, ...
- (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(2)
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选的第二部分,其余章节将陆续放出.上一 ...
- C#委托的详细使用
代码如下: public delegate void GreetingDelegate(string name);//定义委托,它定义了可以代表方法的类型 class Program { public ...
- [转载]iOS开发:获取设备信息
开发iOS平台的应用的时候,可以获取iOS设备的设备信息,包括设备的名称,设备的机型,设备的iOS版本等等.设备信息主要来自 UIDevice 类. UIDevice *currentDevice = ...
- poj1064 二分,注意精度!
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35269 Accepted: 7513 Des ...