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 }

 

posted @ 2021-02-04 17:46  icey_z  阅读(176)  评论(0)    收藏  举报