题目链接
题意:三维空间,从原点能看到哪些点,也就是gcd(x,y,z)==1
莫比乌斯反演计算即可
定义:
f(x):gcd(x,y,z)==k
的个数,
F(k):gcd(x,y,z)=k
的倍数的个数,那么
F(n)=∑n|df(d)
f(n)=∑n|du(dn)F(d)
F(d)=⌊Nd⌋⌊Nd⌋⌊Nd⌋
f(n)=∑n|du(dn)⌊Nd⌋⌊Nd⌋⌊Nd⌋
然后就是计算n==1的f(1)了,f(1)是x,y,z,都不小于1的答案
还要加上坐标轴3,以及三个坐标平面的贡献,
#include <cstdio>
#include <cstring>
#define N 1000024
using namespace std;
long long miu[N], p[N], tot;
bool flag[N];
void mobius() {
memset(flag, 0, sizeof(flag));
tot = 0;
miu[1] = 1;
for (long long i = 2; i < N; ++i) {
if (!flag[i]) {
p[tot++] = i;
miu[i] = -1;
}
for (long long j = 0; j < tot && i * p[j] < N; ++j) {
flag[i * p[j]] = true;
if (i % p[j]) {
miu[i * p[j]] = -miu[i];
}
else {
miu[i * p[j]] = 0;
break;
}
}
}
}
int main() {
mobius();
long long T, ans, n;
scanf("%lld", &T);
while(T--) {
scanf("%lld", &n);
ans = 3;
for (long long i = 1; i <= n; ++i)
ans += miu[i] * (n / i) * (n / i) * ((n / i) + 3);
printf("%lld\n",ans);
}
}