莫比乌斯反演,注意0的情况特殊考虑下就可以了
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000005;
int mo[N], prime[N], pn;
bool vis[N];
void Moblus() {
memset(vis, false, sizeof(vis));
mo[1] = 1; pn = 0;
for(int i = 2; i < N; i++) {
if(!vis[i]) {
prime[pn++] = i;
mo[i] = -1;
}
for(int j = 0; j < pn; j++) {
if(i * prime[j] >= N) break;
vis[i * prime[j]] = true;
if(i % prime[j] == 0) {
mo[i * prime[j]] = 0;
break;
} else mo[i * prime[j]] = -mo[i];
}
}
}
typedef long long ll;
int t, n;
int main() {
Moblus();
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
ll ans = 3;
for (int i = 1; i <= n; i++) {
ans += (ll)mo[i] * (n / i) * (n / i) * (n / i);
ans += (ll)mo[i] * (n / i) * (n / i) * 3;
}
printf("%lld\n", ans);
}
return 0;
}