Matrix
Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 4658   Accepted: 1189

Description

Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that equals i2 + 100000 × i + j2 - 100000 × j + i × j,
you are to find the M-th smallest element in the matrix.

Input

The first line of input is the number of test case.

For each test case there is only one line contains two integers, N(1 ≤ N ≤ 50,000) and M(1 ≤ M ≤ N × N). There is a blank line before each test case.

Output

For each test case output the answer on a single line.

Sample Input

12

1 1

2 1

2 2

2 3

2 4

3 1

3 2

3 8

3 9

5 1

5 25

5 10

Sample Output

3
-99993
3
12
100007
-199987
-99993
100019
200013
-399969
400031
-99939

Source

首先打个表看看,初步觉得左下到右上递增。
认真一看,又不是特别有规律,在N比較大时候,递增就木有了。
可是每一列的单调性是能够保持的。这个分别将i,j看成常数求一下导数就很easy知道了。

这个二分有意思。
在long long 范围内二分一个数X。>号即为 满足X大于矩阵的数大于等于M个
而大于矩阵的数的个数能够通过每一列二分来确定。
时间复杂度log(10^18)*N*log(N)。


#include <iostream>

using namespace std;
long long N, M;
const long long INF = 1LL << 50;
long long mtr ( long long i, long long j )
{
return i * i + 100000 * i + j * j - 100000 * j + i * j;
} bool b_s ( long long X )
{
long long res = 0; for ( int i = 1; i <= N; i++ )
{
int cnt = N ;
int l = 1, r = N; while ( l <= r )
{
int mid = ( r + l ) >> 1; if ( mtr ( mid, i ) >= X )
{
r = mid - 1;
cnt = mid - 1;
}
else
{
l = mid + 1;
}
} res += cnt ;
}
return res >= M;
}
int main()
{
int n;
cin >> n ;
while ( n-- )
{
cin >> N >> M;
long long l = -INF, r = INF;
long long ans=-1; while ( l <= r )
{
long long mid = ( r + l )>>1;
if ( b_s ( mid ) )
{
r = mid - 1;
ans = mid - 1;
}
else
{
l = mid + 1;
}
} cout <<ans << endl;
} return 0;
}



最新文章

  1. 消灭textarea中的神秘空格
  2. ERROR:The requested URL could not be retrieved解决方法
  3. Android 高级UI设计笔记02:可以拖动交换item位置的GridView(转载)
  4. Oracle学习笔记之数据类型
  5. Sort--冒泡排序
  6. 修改sphinx最大输出记录数
  7. Contains Duplicate,Contains Duplicate II,Contains Duplicate III
  8. jquery layer弹窗弹层插件 (转)
  9. Java Properties 类读配置文件保持顺序
  10. 怎么让微信下载APK文件包,微信内置浏览器无法打开APP下载链接的解决方案
  11. github---无命令可视化界面操作
  12. Android开发工程师文集-1 小时学会SQLite
  13. day_10py 简单地名字管理系统
  14. leetcode-algorithms-26 Remove Duplicates from Sorted Array
  15. Hdu1796 How many integers can you find 2017-06-27 15:54 25人阅读 评论(0) 收藏
  16. HDS推出HUS中端阵列 文件、块和对象统一存储
  17. Git4:Git标签
  18. iOS开发系列课程预告
  19. SVN 使用学习记录
  20. 凌华AMP-204C卡的CNC功能 即Feeder工具的使用。

热门文章

  1. MYSQL工具之binlog2sql闪回操作
  2. Python笔记(十)——操作SQLServer
  3. B - Calculating Function
  4. 纯CSS3文字Loading动画特效
  5. 杭电2060WA
  6. apicloud开发方法。
  7. MongoDB 学习笔记(六):备份与用户管理
  8. tensorflow常见函数
  9. 前端异步编程之Promise和async的用法
  10. Codeforces 789A Anastasia and pebbles( 水 )