E. Number Challenge
问题: ∑ i = 1 a ∑ j = 1 b ∑ k = 1 c d ( i j k ) \sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk) ∑i=1a∑j=1b∑k=1cd(ijk), d ( n ) d(n) d(n)表示n的因子个数。
推式子:
∑
i
=
1
a
∑
j
=
1
b
∑
k
=
1
c
d
(
i
j
k
)
∑
i
=
1
a
∑
j
=
1
b
∑
k
=
1
c
∑
x
∣
i
∑
y
∣
j
∑
z
∣
k
[
g
c
d
(
x
,
y
)
=
1
]
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
x
=
1
a
∑
y
=
1
b
∑
z
=
1
c
∑
i
=
1
a
∑
j
=
1
b
∑
k
=
1
c
∑
x
∣
i
∑
y
∣
j
∑
z
∣
k
[
g
c
d
(
x
,
y
)
=
1
]
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
x
=
1
a
∑
y
=
1
b
∑
z
=
1
c
⌊
a
x
⌋
⌊
b
y
⌋
⌊
c
z
⌋
[
g
c
d
(
x
,
y
)
=
1
]
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
x
=
1
a
∑
y
=
1
b
∑
z
=
1
c
⌊
a
x
⌋
⌊
b
y
⌋
⌊
c
z
⌋
∑
d
∣
g
c
d
(
x
,
y
)
μ
(
d
)
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
d
=
1
m
i
n
(
a
,
b
)
∑
x
=
1
a
∑
y
=
1
b
∑
z
=
1
c
⌊
a
x
⌋
⌊
b
y
⌋
⌊
c
z
⌋
∑
d
∣
g
c
d
(
x
,
y
)
μ
(
d
)
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
d
=
1
m
i
n
(
a
,
b
)
μ
(
d
)
∑
x
=
1
,
d
∣
x
a
∑
y
=
1
,
d
∣
y
b
∑
z
=
1
c
⌊
a
x
⌋
⌊
b
y
⌋
⌊
c
z
⌋
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
d
=
1
m
i
n
(
a
,
b
)
μ
(
d
)
∑
x
=
1
⌊
a
d
⌋
∑
y
=
1
⌊
b
d
⌋
∑
z
=
1
c
⌊
a
d
x
⌋
⌊
b
d
y
⌋
⌊
c
z
⌋
[
g
c
d
(
y
,
z
)
=
1
]
[
g
c
d
(
x
,
z
)
=
1
]
∑
d
=
1
m
i
n
(
a
,
b
)
μ
(
d
)
∑
z
=
1
c
∑
x
=
1
⌊
a
d
⌋
[
g
c
d
(
x
,
z
)
=
1
]
⌊
a
d
x
⌋
∑
y
=
1
⌊
b
d
⌋
⌊
b
d
y
⌋
⌊
c
z
⌋
[
g
c
d
(
y
,
z
)
=
1
]
\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk)\\ \sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c\sum_{x|i}\sum_{y|j}\sum_{z|k}[gcd(x,y)=1][gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{x=1}^a\sum_{y=1}^b\sum_{z=1}^c\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c\sum_{x|i}\sum_{y|j}\sum_{z|k}[gcd(x,y)=1][gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{x=1}^a\sum_{y=1}^b\sum_{z=1}^c\lfloor\frac ax\rfloor\lfloor\frac by\rfloor\lfloor\frac cz\rfloor[gcd(x,y)=1][gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{x=1}^a\sum_{y=1}^b\sum_{z=1}^c\lfloor\frac ax\rfloor\lfloor\frac by\rfloor\lfloor\frac cz\rfloor\sum_{d|gcd(x,y)}\mu(d)[gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{d=1}^{min(a,b)}\sum_{x=1}^a\sum_{y=1}^b\sum_{z=1}^c\lfloor\frac ax\rfloor\lfloor\frac by\rfloor\lfloor\frac cz\rfloor\sum_{d|gcd(x,y)}\mu(d)[gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{d=1}^{min(a,b)}\mu(d)\sum_{x=1,d|x}^a\sum_{y=1,d|y}^b\sum_{z=1}^c\lfloor\frac ax\rfloor\lfloor\frac by\rfloor\lfloor\frac cz\rfloor[gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{d=1}^{min(a,b)}\mu(d)\sum_{x=1}^{\lfloor\frac ad\rfloor}\sum_{y=1}^{\lfloor\frac bd\rfloor}\sum_{z=1}^c\lfloor\frac a{dx}\rfloor\lfloor\frac b{dy}\rfloor\lfloor\frac cz\rfloor[gcd(y,z)=1][gcd(x,z)=1]\\ \sum_{d=1}^{min(a,b)}\mu(d)\sum_{z=1}^c\sum_{x=1}^{\lfloor\frac ad\rfloor}[gcd(x,z)=1]\lfloor\frac a{dx}\rfloor\sum_{y=1}^{\lfloor\frac bd\rfloor}\lfloor\frac b{dy}\rfloor\lfloor\frac cz\rfloor[gcd(y,z)=1]\\
i=1∑aj=1∑bk=1∑cd(ijk)i=1∑aj=1∑bk=1∑cx∣i∑y∣j∑z∣k∑[gcd(x,y)=1][gcd(y,z)=1][gcd(x,z)=1]x=1∑ay=1∑bz=1∑ci=1∑aj=1∑bk=1∑cx∣i∑y∣j∑z∣k∑[gcd(x,y)=1][gcd(y,z)=1][gcd(x,z)=1]x=1∑ay=1∑bz=1∑c⌊xa⌋⌊yb⌋⌊zc⌋[gcd(x,y)=1][gcd(y,z)=1][gcd(x,z)=1]x=1∑ay=1∑bz=1∑c⌊xa⌋⌊yb⌋⌊zc⌋d∣gcd(x,y)∑μ(d)[gcd(y,z)=1][gcd(x,z)=1]d=1∑min(a,b)x=1∑ay=1∑bz=1∑c⌊xa⌋⌊yb⌋⌊zc⌋d∣gcd(x,y)∑μ(d)[gcd(y,z)=1][gcd(x,z)=1]d=1∑min(a,b)μ(d)x=1,d∣x∑ay=1,d∣y∑bz=1∑c⌊xa⌋⌊yb⌋⌊zc⌋[gcd(y,z)=1][gcd(x,z)=1]d=1∑min(a,b)μ(d)x=1∑⌊da⌋y=1∑⌊db⌋z=1∑c⌊dxa⌋⌊dyb⌋⌊zc⌋[gcd(y,z)=1][gcd(x,z)=1]d=1∑min(a,b)μ(d)z=1∑cx=1∑⌊da⌋[gcd(x,z)=1]⌊dxa⌋y=1∑⌊db⌋⌊dyb⌋⌊zc⌋[gcd(y,z)=1]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e3+10;
const double eps = 1e-5;
const int inf = 0x7ffffff;
const ll mod = 1073741824;
int p[N], tot, mu[N];
int a, b, c, g[N][N];
bool st[N];
//求出莫比乌斯函数mu[].
void init() {
st[1] = mu[1] = 1;
for(int i=2; i<N; i++) {
if(!st[i]) p[tot++] = i, mu[i] = -1;
for(int j=0; j<tot&&i*p[j]<N; j++) {
st[i*p[j]] = 1;
if(i % p[j] == 0) break;
mu[i*p[j]] = -mu[i];
}
}
}
//最大公因子
int gcd(int a, int b) {
if(!b) return a;
else return gcd(b, a%b);
}
//打表
void get_gcd() {
for(int i=1; i<=c; i++) {
for(int j=1; j<=c; j++) {
g[i][j] = gcd(i, j);
}
}
}
//换a,b,c的顺序.
void sort_3() {
int A = a, B = b, C = c;
a = min({A, B, C});
c = max({A, B, C});
b = A+B+C-a-c;
}
//\sum_{i=1}^n[gcd(i, m)=1]n/x
ll f(ll n, ll m) {
ll ans = 0;
for(int i=1; i<=n; i++) {
if(g[i][m] == 1) ans += n/i;
}
ans = (ans + mod) % mod;
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
init();
cin >> a >> b >> c;
sort_3();
get_gcd();
ll ans = 0;
//核心。
for(int i=1; i<=a; i++) {
for(int j=1; j<=b; j++) {
if(g[i][j] == 1) {
ans = (ans + mu[j]*(a/i)%mod * f(b/j, i)%mod * f(c/j, i)%mod + mod) % mod;
}
}
}
cout << ans << endl;
return 0;
}