#include #include #include const int maxn=(int)(1e7)+5; using namespace std; bool check[maxn]; int pr[maxn / 5], mn[maxn]; int tt[maxn]; int tot; int T; void euler() { memset(check,0,sizeof(check)); tot=0; //x=1时的函数值 for(int i=2;imaxn) break; check[i*pr[j]]=1; mn[i*pr[j]] = pr[j]; if(i%pr[j]==0) { break; } else { //满足积性 - 运用积性函数性质直接求得 } } } } int main() { euler(); tt[0] = 0; for (int i = 1; i < maxn; ++ i) tt[i] += tt[i - 1]; scanf("%d", &T); while (T --) { int n, d, ans; scanf("%d%d", &n, &d); n --; if (d >= maxn) { ans = n / d; for (int i = 1; pr[i] < ans; ++ i) if (d % pr[i] == 0) {ans = pr[i]; break;} printf("%d\n", tt[ans]); } else printf("%d\n", tt[min(n / d, mn[d])]); } }