本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目链接
定义一对数 ( a , b ) (a,b) (a,b) 是特殊的,当且仅当 ⌊ a b ⌋ = a m o d b \lfloor\dfrac{a}{b}\rfloor=a\bmod b ⌊ba⌋=amodb
给定 x 和 y ,求一共有多少对特殊的数 ( a , b ) (a,b) (a,b), 1 ≤ a ≤ x , 1 ≤ b ≤ y 1\le a\le x,1\le b\le y 1≤a≤x,1≤b≤y
思路
这种推导式子的一般就是不断的对式子进行变形,然后在过程中发现相关的特性。
本题根据数据范围看,要么是结论题,要么是的算法
这时发现特性:是整数,那么也是整数,则a是b+1的倍数,即
然后根据
得到
代换一下得到, 则
结合上述两点性质,得到a的个数为
因为a和b需要满足固定的范围,则答案
我们只需要将b枚举到即可,后面上面分子始终取x,后面就可以用整除分块解决问题
进行整除分块,注意整除分块时还要注意对应的范围,,因为初始就加了一
是因为后面就取零了,不能算上去,所以这个是右边界
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll x, y;
cin >> x >> y;
ll res = 0;
ll a = 1, b = 1;
for(; b * b - 1 <= x && b <= y; b++)
res += (b * b + b - 1) / (b + 1);
ll l = b + 1, r;
for(; l <= x && l <= y + 1; l = r + 1)
{
r = min(x / (x / l), y + 1);
res += x / l * (r - l + 1);
if(r == y + 1)
break;
}
cout << res << "\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
// t = 1;
while(t--)
solve();
return 0;
}