数子的升级准则
问题描述:
现有 (n) 个数字,分别是 (1,2,3,...,n),每个数字初始等级都为 (0),对于第 (i) 个数字每过 (i) 个时间就会升一级,例如 (5) 个数字过去 (3) 个时间后它们的等级分别是 (3, 1, 1, 0, 0) 。
问题来了,(n) 个数字经过 (n) 个时间后把他们的等级进行降序排序并去重后的得到一个等级表,那么你知道第 (x) 个数字的等级在这张等级表中排第几吗?
(ps:若 (n=5) 时降序排序为 {(5,2,1,1,1)},则去重后的等级表为{(5,2,1)})
输入描述
第一行输入一个正整数 (T(1 leq T leq10^6)),表示测试案例的数目,对于每组案例。
一行两个正整数(n,x(1 leq x leq nleq 10^9)) 。
输出描述
对于每个案例,输出一个正整数表示答案。
示例
输入
2
25 9
1000000000 1000000000
输出
8
63244
思路:当 (i*j leq n) 时,(i) 和 (j) 在等级表中等级必定不一样,同时数字的等级满足数论分块(对称性),所以 (O(1)) 可做。
#include<bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T --) {
int n, x;
cin >> n >> x;
int m = sqrt(n);
if (n >= m*(m+1)) {
if (x <= m + 1) cout << x << "
";
else cout << 2*m - n/x +1 << "
";
}
else {
if (x <= m) cout << x << "
";
else cout << 2*m -n/x << "
";
}
}
return 0;
}