You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.4 KiB

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int M = 110, N = 10000010;
int t, m, sqrtN, n, ans, q[M];
// 筛法求莫比乌斯函数(枚举约数)
int mu[N], sum[N]; // sum[N]:梅滕斯函数,也就是莫比乌斯函数的前缀和
int primes[N], cnt;
bool st[N];
void get_mobius(int n) {
mu[1] = 1;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
primes[cnt++] = i;
mu[i] = -1;
}
for (int j = 0; primes[j] <= n / i; j++) {
int t = primes[j] * i;
st[t] = true;
if (i % primes[j] == 0) {
mu[t] = 0;
break;
}
mu[t] = -mu[i];
}
}
// 维护u(x)前缀和:梅滕斯函数
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + mu[i];
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("SQP4168.in", "r", stdin);
#endif
cin >> t;
for (int i = 1; i <= t; i++) {
cin >> q[i];
n = max(n, q[i]);
}
sqrtN = sqrt(n);
get_mobius(sqrtN); // 线性求莫比乌斯函数, 前缀和
for (int i = 1; i <= t; i++) {
n = q[i];
ans = 0;
for (int l = 1, r; l <= n; l = r + 1) {
if (n / (l * l) == 0) { break; }
r = sqrt(n / (n / (l * l)));
ans += n / (l * l) * (sum[r] - sum[l - 1]);
}
printf("%lld\n", ans);
}
}