brz的函数
∑i=1n∑j=1nμ(ij)假设i,j不互质,一定有μ(ij)=0所以上式=∑i=1n∑j=1nμ(ij)[gcd(i,j)=1]积性函数性质有μ(ij)=μ(i)μ(j)∑i=1n∑j=1nμ(i)μ(j)[gcd(i,j)=1]∑i=1n∑j=1nμ(i)μ(j)∑d∣gcd(i,j)μ(d)这里我们按照套路把d给提前去,因为i,j都要是d的倍数所以我们直接枚举I=id,J=jd∑d=1nμ(d)∑I=1ndμ(Id)∑J=1ndμ(Jd)为了方便这里i=I,j=J∑d=1nμ(d)∑i=1ndμ(id)∑j=1ndμ(jd)设f(n,d)=∑i=1ndμ(id)原式=∑d=1nμ(d)f(n,d)2接下来考虑如何求解f(n,d),不难发现对于每一个f(n,d)其有贡献都是一个区间的形式,也就是f(l,d)=f(r,d)[l<=r]所以这里我们就可以利用前缀和的思想来得到答案。\sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \mu(ij)\\ 假设i, j不互质,一定有\mu(ij) = 0\\ 所以上式= \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \mu(ij)[gcd(i, j) = 1]\\ 积性函数性质有\mu(ij) = \mu(i) \mu(j)\\ \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \mu(i) \mu(j)[gcd(i, j) = 1]\\ \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \mu(i) \mu(j) \sum_{d \mid gcd(i, j)} \mu(d)\\ 这里我们按照套路把d给提前去,因为i, j都要是d的倍数所以我们直接枚举I = \frac{i}{d},J = \frac{j}{d}\\ \sum_{d = 1} ^{n} \mu(d) \sum_{I = 1} ^{\frac{n}{d}} \mu(Id) \sum_{J = 1} ^{\frac{n}{d}} \mu(Jd)\\ 为了方便这里i = I, j = J\\ \sum_{d = 1} ^{n} \mu(d) \sum_{i = 1} ^{\frac{n}{d}}\mu(id) \sum_{j = 1} ^{\frac{n}{d}} \mu(jd)\\ 设f(n, d) = \sum_{i = 1} ^{\frac{n}{d}} \mu(id)\\ 原式 = \sum_{d = 1} ^{n} \mu(d)f(n,d) ^ 2\\ 接下来考虑如何求解f(n, d),\\ 不难发现对于每一个f(n, d)其有贡献都是一个区间的形式,\\ 也就是f(l, d) = f(r,d)[l <= r]\\ 所以这里我们就可以利用前缀和的思想来得到答案。 i=1∑nj=1∑nμ(ij)假设i,j不互质,一定有μ(ij)=0所以上式=i=1∑nj=1∑nμ(ij)[gcd(i,j)=1]积性函数性质有μ(ij)=μ(i)μ(j)i=1∑nj=1∑nμ(i)μ(j)[gcd(i,j)=1]i=1∑nj=1∑nμ(i)μ(j)d∣gcd(i,j)∑μ(d)这里我们按照套路把d给提前去,因为i,j都要是d的倍数所以我们直接枚举I=di,J=djd=1∑nμ(d)I=1∑dnμ(Id)J=1∑dnμ(Jd)为了方便这里i=I,j=Jd=1∑nμ(d)i=1∑dnμ(id)j=1∑dnμ(jd)设f(n,d)=i=1∑dnμ(id)原式=d=1∑nμ(d)f(n,d)2接下来考虑如何求解f(n,d),不难发现对于每一个f(n,d)其有贡献都是一个区间的形式,也就是f(l,d)=f(r,d)[l<=r]所以这里我们就可以利用前缀和的思想来得到答案。
/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;const int N = 5e4 + 10;int prime[N], mu[N], ans[N], cnt, n;bool st[N];void init() {mu[1] = 1;for(int i = 2; i < N; i++) {if(!st[i]) {prime[++cnt] = i;mu[i] = -1;}for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if(i % prime[j] == 0) {break;}mu[i * prime[j]] = -mu[i];}}for(int d = 1; d < N; d++) {int res = 0;for(int l = d; l < N; l += d) {int r = l + d - 1;r = min(r, N - 2);res += mu[l];ans[l] += mu[d] * res * res;ans[r + 1] -= mu[d] * res * res;}}for(int i = 1; i < N; i++) {ans[i] += ans[i - 1];}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);init();int T;scanf("%d", &T);while(T--) {scanf("%d", &n);printf("%d\n", ans[n]);}return 0;
}