从因数的角度来考虑,枚举$m$的每个因数。
每存在一对因数,也就是$a \times b = m$的时候,$ans$就要加上$2$,因为一个是第a行第b列,一个是第b行第a列。
但是还有一个特殊情况,例如$n = m = 36$的时候,$36$是一个完全平方数,这样$6 \times 6$就算了两次,所以要减去一个。
#include <bits/stdc++.h>
using namespace std;
int t, n, m;
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
int ans = 0;
for (int i = 1;i * i <= m; i++) if (m % i == 0 && m / i <= n) ans += 2;
if ((int)sqrt(m) * (int)sqrt(m) == m && sqrt(m) <= n) ans--;
printf("%d\n", ans);
}
return 0;
}