#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ul; typedef vector vi; typedef pair pii; #define rep(i,l,r) for(int i=l;i<(r);++i) #define per(i,l,r) for(int i=r-1;i>=(l);--i) #define sz(x) ((int)((x).size())) #define sqr(x) ((ll)(x)*(x)) #define all(x) (x).begin(),(x).end() #define mp make_pair #define pb push_back #define fi first #define se second #define de(x) cout << #x << " = " << x << endl; #define debug(x) freopen(x".in", "r", stdin); #define setIO(x) freopen(x".in", "r", stdin);freopen(x".out", "w", stdout); const ll LINF = 1e18 + 7; const ul BASE = 33; const int N = 1e6 + 7; const int INF = 1e9 + 7; const int MOD = 1000000007; const double Pi = acos(-1.); const double EPS = 1e-8; ll kpow(ll a, ll b) { ll ret = 1; for (; b; b >>= 1, a = a * a) if (b & 1) ret = ret * a; return ret; } //--------------head-------------- vi pri; int fac[N]; bool p[N]; void prime() { memset(p, false, sizeof(p)); fac[1] = 1; p[2] = false, fac[2] = 2; for (int i = 3; i < N; i += 2) if (!p[i]) { fac[i] = i; for (int j = i << 1; j < N; j += i) if (!p[j]) p[j] = true, fac[j] = i; } pri.pb(2); for (int i = 2; i < N; i += 2) p[i] = true, fac[i] = 2; for (int i = 3; i < N; i += 2) if (!p[i]) pri.pb(i); // printf("sz = %d\n", sz(pri)); } int main() { prime(); int T; scanf("%d", &T); rep(cas, 0, T) { int n, d, ans; scanf("%d%d", &n, &d); if (d < N) { // printf("fac[%d] = %d\n", d, fac[d]); int X = min(fac[d], (n - 1) / d); ans = upper_bound(all(pri), X) - pri.begin(); } else { ans = 0; rep(i, 0, sz(pri)) { ll x = pri[i]; if (x * d >= n) break; ++ans; if (d % x == 0) break; } } printf("%d\n", ans); } return 0; }