2021牛客寒假集训营第二场-D牛牛与整除分块
链接:https://ac.nowcoder.com/acm/contest/9982/D
来源:牛客网
D牛牛与整除分块
题目描述

输入描述:
输出描述:

解题思路
以 n = 25 为例 S = { 25, 12, 8, 6, 5, 4, 3, 2, 1} 可以看出,以sqrt(n)为分界点,可以分为左右两部分
时,
的值各不相等,
越小,
越大,因此此时只需要直接输出x即可.
讨论
的情况,在25的例子中,可以看到5右侧的数和5左侧的数数量是相等的,且有着一一对应的关系,例如 ,
所以 只需要找到
对应的元素,就可以知道
是第几小的元素,只需要知道整个集合大小,就可以知道
在元素中是排第几。
所以最终的问题就转化为找出对于 n ,集合 S 有几个元素。记 , 集合元素数量为
,尝试了前几项后,可以发现有以下规律
时
时
这样就找出了集合S的大小,即可得到结果
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 using ll = long long; 4 void solve() 5 { 6 ll n, x; 7 cin >> n >> x; 8 if (x * x <= n) 9 { 10 cout << x << "\n"; 11 return; 12 } 13 ll num; 14 ll t = sqrt(n); 15 if (n - t * t >= t) 16 num = t * 2; 17 else 18 num = t * 2 - 1; 19 cout << num - n / x + 1 << "\n"; 20 } 21 int main() 22 { 23 ios::sync_with_stdio(false); 24 cin.tie(0); 25 int t; 26 cin >> t; 27 while (t--) 28 { 29 solve(); 30 } 31 return 0; 32 }

浙公网安备 33010602011771号