开始推式子
a
n
s
=
∑
i
=
1
A
∑
j
=
1
B
∑
k
=
1
C
ϕ
(
gcd
(
i
,
j
2
,
k
3
)
)
\begin{aligned} ans = \sum_{i = 1}^{A}\sum_{j = 1}^{B}\sum_{k = 1}^{C}\phi(\gcd(i, j^{2}, k^{3})) \end{aligned}
ans=i=1∑Aj=1∑Bk=1∑Cϕ(gcd(i,j2,k3))
我们令
gcd
(
i
,
j
2
,
k
3
)
=
d
\gcd(i, j ^ {2}, k ^ {3}) = d
gcd(i,j2,k3)=d
a
n
s
=
∑
d
=
1
min
(
A
,
B
,
C
)
ϕ
(
d
)
∑
i
=
1
A
∑
j
=
1
B
∑
k
=
1
C
[
gcd
(
i
,
j
2
,
k
3
)
=
=
d
]
\begin{aligned} ans = \sum_{d = 1}^{\min(A, B, C)}\phi(d)\sum_{i = 1}^{A}\sum_{j = 1}^{B}\sum_{k = 1}^{C}[\gcd(i, j^{2}, k^{3}) == d] \end{aligned}
ans=d=1∑min(A,B,C)ϕ(d)i=1∑Aj=1∑Bk=1∑C[gcd(i,j2,k3)==d]
我们设:
f
(
d
)
=
∑
i
=
1
A
∑
j
=
1
B
∑
k
=
1
C
[
gcd
(
i
,
j
2
,
k
3
)
=
=
d
]
f(d) = \sum_{i = 1}^{A}\sum_{j = 1}^{B}\sum_{k = 1}^{C}[\gcd(i, j^{2}, k^{3}) == d]
f(d)=∑i=1A∑j=1B∑k=1C[gcd(i,j2,k3)==d]
F
(
n
)
=
∑
n
∣
d
f
(
d
)
F(n) = \sum_{n \mid d}{f(d)}
F(n)=∑n∣df(d)
莫比乌斯反演
f
(
n
)
=
∑
n
∣
d
μ
(
d
n
)
∗
F
(
d
)
f(n) = \sum_{n \mid d}\mu(\frac{d}{n})*F(d)
f(n)=∑n∣dμ(nd)∗F(d)
带入上式:
a
n
s
=
∑
k
=
1
min
(
A
,
B
,
C
)
ϕ
(
k
)
∑
k
∣
d
μ
(
d
k
)
F
(
d
)
=
∑
d
=
1
min
(
A
,
B
,
C
)
F
(
d
)
∑
k
∣
d
ϕ
(
k
)
μ
(
d
k
)
\begin{aligned} ans = \sum_{k = 1}^{\min(A, B, C)}\phi(k)\sum_{k \mid d}\mu(\frac{d}{k})F(d) = \sum_{d = 1}^{\min(A, B, C)}F(d)\sum_{k \mid d}\phi(k)\mu(\frac{d}{k}) \end{aligned}
ans=k=1∑min(A,B,C)ϕ(k)k∣d∑μ(kd)F(d)=d=1∑min(A,B,C)F(d)k∣d∑ϕ(k)μ(kd)
我们发现后面的
∑
k
∣
d
ϕ
(
k
)
μ
(
d
k
)
\sum_{k \mid d}\phi(k)\mu(\frac{d}{k})
∑k∣dϕ(k)μ(kd)满足狄利克雷卷积(积性函数的狄利克雷卷积还是积性函数)
a
n
s
=
∑
d
=
1
min
(
A
,
B
,
C
)
F
(
d
)
(
μ
∗
ϕ
)
(
d
)
\begin{aligned} ans = \sum_{d = 1}^{\min(A, B, C)}F(d)(\mu * \phi)(d) \end{aligned}
ans=d=1∑min(A,B,C)F(d)(μ∗ϕ)(d)
首先我们解决这个卷积
(
μ
∗
ϕ
)
(
d
)
=
∑
k
∣
d
ϕ
(
k
)
μ
(
d
k
)
(\mu * \phi)(d) = \sum_{k \mid d}\phi(k)\mu(\frac{d}{k})
(μ∗ϕ)(d)=∑k∣dϕ(k)μ(kd)
当
d
=
1
,
μ
(
1
)
=
1
,
ϕ
(
1
)
=
1
,
所
以
(
μ
∗
ϕ
)
(
1
)
=
1
当d = 1, \mu(1) = 1, \phi(1) = 1,所以(\mu * \phi)(1) = 1
当d=1,μ(1)=1,ϕ(1)=1,所以(μ∗ϕ)(1)=1
当
d
∈
p
r
i
m
e
当d \in prime
当d∈prime,
μ
(
d
)
=
−
1
\mu(d) = -1
μ(d)=−1 ,
ϕ
(
d
)
=
d
−
1
\phi(d) = d - 1
ϕ(d)=d−1 ,
所
以
(
μ
∗
ϕ
)
(
d
)
=
d
−
2
所以(\mu * \phi)(d) = d - 2
所以(μ∗ϕ)(d)=d−2
当
d
=
p
n
当 d = p ^ {n}
当d=pn,
(
μ
∗
ϕ
)
(
d
)
=
(
p
−
1
)
2
p
n
−
2
(\mu * \phi)(d) = (p - 1)^{2}p^{n - 2}
(μ∗ϕ)(d)=(p−1)2pn−2
证明一下:(以下*是卷积符号)
先给个式子
ϕ
(
n
)
=
∑
d
∣
n
(
μ
∗
ϕ
)
(
d
)
\phi(n) = \sum_{d \mid n}(\mu * \phi)(d)
ϕ(n)=∑d∣n(μ∗ϕ)(d)
ϕ
(
p
n
)
=
ϕ
(
p
n
−
1
)
+
(
μ
∗
ϕ
)
(
p
n
)
\phi(p^{n}) = \phi(p^{n - 1}) + (\mu * \phi)(p ^ {n})
ϕ(pn)=ϕ(pn−1)+(μ∗ϕ)(pn)
(
μ
∗
ϕ
)
(
p
n
)
=
ϕ
(
p
n
)
−
ϕ
(
p
n
−
1
)
(\mu * \phi)(p^{n})=\phi(p ^ {n}) - \phi(p ^ {n - 1})
(μ∗ϕ)(pn)=ϕ(pn)−ϕ(pn−1)
(
μ
∗
ϕ
)
(
p
n
)
=
p
n
−
1
(
p
−
1
)
−
p
n
−
2
(
p
−
1
)
(\mu * \phi)(p^{n})=p^{n - 1}(p - 1) - p ^ {n - 2}(p - 1)
(μ∗ϕ)(pn)=pn−1(p−1)−pn−2(p−1)
(
μ
∗
ϕ
)
(
p
n
)
=
(
p
−
1
)
2
p
n
−
2
(\mu * \phi)(p^{n})=(p - 1)^{2}p^{n - 2}
(μ∗ϕ)(pn)=(p−1)2pn−2
现在就剩下个F(d)没有解决了
F(d)意义是,
d
∣
i
d \mid i
d∣i ,
d
∣
j
2
d \mid j ^ {2}
d∣j2,
d
∣
k
3
d \mid k ^ {3}
d∣k3满足条件的d的个数
我们发现满足条件的d,当且仅当
p
⌈
q
k
⌉
∣
x
p^{\lceil{\frac{q}{k}}\rceil} \mid x
p⌈kq⌉∣x,p是d的质因子,q是质因子的最高次幂,
满足条件的
d
=
∏
p
⌈
q
k
⌉
d = \prod p^{\lceil{\frac{q}{k}}\rceil}
d=∏p⌈kq⌉ 在
x
k
x^{k}
xk下
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod = (1ll << 30);
const int N = 1e7 + 6;
template <typename T>
void out(T x) { cout << x << endl; }
ll fast_pow(ll a, ll b, ll p) {ll c = 1; while(b) { if(b & 1) c = c * a % p; a = a * a % p; b >>= 1;} return c;}
//开long long 疯狂超时
int pu[N], prime[N], f1[N], f2[N], tot;//pu为莫比乌斯函数与欧拉函数的狄利克雷卷积
bool mark[N];
void get_pu()
{
memset(mark, 0, sizeof(mark));
tot = 0;
mark[0] = mark[1] = true;
pu[1] = f1[1] = f2[1] = 1;//f1, f2也是积性函数
for(int i = 2; i < N; i ++)
{
if(!mark[i])
{
prime[tot ++] = i;
pu[i] = i - 2;
f1[i] = f2[i] = i;
}
for(int j = 0; j < tot && i * prime[j] < N; j ++)
{
mark[i * prime[j]] = true;
if(i % prime[j] == 0)
{
int tmp = i * prime[j], cnt = 0;
while(cnt <= 3 && tmp % prime[j] == 0)
cnt ++, tmp /= prime[j];
f1[i * prime[j]] = f1[i / prime[j]] * prime[j];
if(cnt == 2)
{
f2[i * prime[j]] = f2[i / prime[j]] * prime[j];
pu[i * prime[j]] = pu[i / prime[j]] * (prime[j] - 1) * (prime[j] - 1);
}
else
{
f2[i * prime[j]] = f2[i / prime[j] / prime[j]] * prime[j];
pu[i * prime[j]] = pu[i] * prime[j];
}
break;
}
f1[i * prime[j]] = f1[i] * prime[j];
f2[i * prime[j]] = f2[i] * prime[j];
pu[i * prime[j]] = pu[i] * (prime[j] - 2);
}
}
}
int main()
{
ios::sync_with_stdio(false);
get_pu();
int t;
cin >> t;
while(t --)
{
int A, B, C;
cin >> A >> B >> C;
ll ans = 0;
for(int i = 1; i <= A; i ++)
ans = (ans + pu[i] * (A / i) % mod * (B / f1[i]) % mod * (C / f2[i]) % mod + mod) % mod;
cout << ans << endl;
}
}