算法
(数论、暴力枚举) $O(t*\sqrt{x})$
记 $\lfloor \frac{a}{b} \rfloor = a \% b = k$
对于任意 $a$ 有 $a = bk + k$,而 $k^2 < a \leqslant x \ (b > k \Rightarrow k^2 < kb + k = a\)$,所以可以遍历 $k$ 的取值,范围是 $1 \leqslant k \leqslant \sqrt{x}$
于是 $(a, b)$ 就变成了 $(kb + k, b)$,注意到 $a \leqslant x$,故 $kb + k \leqslant x$ 得出 $b \leqslant \lfloor \frac{x}{k} \rfloor - 1$,又 $b \leqslant y$,所以 $b \leqslant \min(y, \lfloor \frac{x}{k} \rfloor - 1)$,此外,$b > k$,所以还需要把前 $k$ 个去除掉。
C++ 代码
#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::min;
using std::max;
using ll = long long;
int main() {
int t;
cin >> t;
while (t--) {
int x, y;
cin >> x >> y;
ll ans = 0;
for (int i = 1; i * i <= x; ++i) {
int r = min(y, x / i - 1);
ans += max(0, r - i);
}
cout << ans << '\n';
}
return 0;
}