#include using namespace std; #define TRACE(x) cerr << #x << ' ' << x << endl #define FOR(i, a, b) for (int i = (a); i < int(b); i++) #define REP(i, n) FOR(i, 0, n) #define _ << ' ' << typedef long long llint; typedef long long ll; typedef pair pii; #define fi first #define sec second #define pb push_back const int MAXN = 1000100; ll pref[MAXN], sum[MAXN]; int divi[MAXN]; int get(int x) { int ret = 1; int tmp = 0; while (x != 1) { int t = divi[x]; tmp = 0; while (x % t == 0) { tmp++; x /= t; } ret *= (tmp + 1); } return ret; } vector pom; int bio[MAXN], cookie; int cnt[MAXN]; void rek(int i, int t, int N) { if (i == (int)pom.size()) { int x = N / t; sum[N] += get(x); if ((ll)x == (ll)t * t) sum[N]--; else { if (int(sqrt(x)) * int(sqrt(x)) == x) sum[N]--; if (x % t == 0) sum[N] -= 2; } return; } if (cnt[pom[i]]) { cnt[pom[i]]--; rek(i, t * pom[i], N); cnt[pom[i]]++; } rek(i + 1, t, N); } void init() { for (int i = 2; i < MAXN; i++) { if (divi[i] != 0) continue; for (int j = 1; i * j < MAXN; j++) divi[i * j] = i; } sum[1] = 0; FOR(i, 2, MAXN) { pom.clear(); int x = i; while (x != 1) { pom.push_back(divi[x]); x /= divi[x]; } cookie++; for (int j = 0; j < (int)pom.size(); j++) { if (bio[pom[j]] != cookie) { bio[pom[j]] = cookie; cnt[pom[j]] = 1; } else cnt[pom[j]]++; } sort(pom.begin(), pom.end()); pom.erase(unique(pom.begin(), pom.end()), pom.end()); rek(0, 1, i); } FOR(i, 1, MAXN) pref[i] = sum[i] + pref[i - 1]; } void solve() { int n; scanf("%d",&n); printf("%lld\n",pref[n]/6); } int main() { init(); int t; scanf("%d",&t); while (t--) solve(); return 0; }