###题意:
求
∑
i
=
1
i
≤
A
∑
j
=
1
j
≤
B
∑
k
=
1
k
≤
C
φ
(
g
c
d
(
i
,
j
2
,
k
3
)
)
\sum_{i=1}^{i\leq A}\sum_{j=1}^{j\leq B}\sum_{k=1}^{k\leq C}\varphi(gcd(i,j^2,k^3))
i=1∑i≤Aj=1∑j≤Bk=1∑k≤Cφ(gcd(i,j2,k3))
###分析:
膜拜cch。。。
狄利克雷卷积:
(
f
∗
g
)
(
D
)
=
∑
d
∣
D
f
(
d
)
×
g
(
D
d
)
(f*g)(D)=\sum_{d|D}f(d)\times g(\frac D d)
(f∗g)(D)=∑d∣Df(d)×g(dD)
由狄利克雷卷积的性质,可得
e
=
1
∗
μ
e=1*\mu
e=1∗μ(e表示单位元)
φ
=
φ
∗
e
=
φ
∗
μ
∗
1
\varphi=\varphi*e=\varphi*\mu*1
φ=φ∗e=φ∗μ∗1(单位元卷任意函数等于其本身,且狄利克雷卷积具有交换律)
由此可得,原式=
∑
i
=
1
i
≤
A
∑
j
=
1
j
≤
B
∑
k
=
1
k
≤
C
∑
d
∣
i
,
d
∣
j
2
,
d
∣
k
3
(
φ
∗
μ
)
(
d
)
\sum_{i=1}^{i\leq A}\sum_{j=1}^{j\leq B}\sum_{k=1}^{k\leq C}\sum_{d|i,d|j^2,d|k^3}(\varphi*\mu)(d)
i=1∑i≤Aj=1∑j≤Bk=1∑k≤Cd∣i,d∣j2,d∣k3∑(φ∗μ)(d)
= ∑ d = 1 d ≤ A ( φ ∗ μ ) ( d ) ∑ i = 1 i ≤ A ∑ j = 1 j ≤ B ∑ k = 1 k ≤ C [ d ∣ i 且 d ∣ j 2 且 d ∣ k 3 ] =\sum_{d=1}^{d\leq A}(\varphi*\mu)(d)\sum_{i=1}^{i\leq A}\sum_{j=1}^{j\leq B}\sum_{k=1}^{k\leq C}[d|i且d|j^2且d|k^3] =d=1∑d≤A(φ∗μ)(d)i=1∑i≤Aj=1∑j≤Bk=1∑k≤C[d∣i且d∣j2且d∣k3]
将x唯一分解,设为
x
=
∏
p
i
k
i
x=\prod p_i^{k_i}
x=∏piki,如果
x
∣
y
t
x|y^t
x∣yt那么
∏
p
i
⌈
k
i
t
⌉
∣
y
\prod p_i^{\lceil \frac {k_i} t\rceil}|y
∏pi⌈tki⌉∣y
设
f
t
(
x
)
=
∏
p
i
⌈
k
i
t
⌉
f_t(x)=\prod p_i^{\lceil \frac {k_i} t\rceil}
ft(x)=∏pi⌈tki⌉
那么原式就可以进一步化为
=
∑
d
=
1
d
≤
A
(
φ
∗
μ
)
(
d
)
⌊
A
f
1
(
d
)
⌋
⌊
B
f
2
(
d
)
⌋
⌊
C
f
3
(
d
)
⌋
=\sum_{d=1}^{d\leq A}(\varphi*\mu)(d)\lfloor \frac A {f_1(d)}\rfloor \lfloor \frac B {f_2(d)}\rfloor \lfloor \frac C {f_3(d)}\rfloor
=d=1∑d≤A(φ∗μ)(d)⌊f1(d)A⌋⌊f2(d)B⌋⌊f3(d)C⌋
(其实
f
1
(
x
)
=
x
f_1(x)=x
f1(x)=x)
(
φ
∗
μ
)
(\varphi *\mu)
(φ∗μ)肯定是积性函数,我就不解释了。。。
然后
f
t
(
x
)
f_t(x)
ft(x)也可以通过欧拉筛的性质(被最小的质因数筛到),来线性地筛出来
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 10000010
#define MAXP 10000000
#define MOD 1000000007
using namespace std;
int n;
int f[MAXN],f2[MAXN],f3[MAXN],ti[MAXN],las[MAXN];
bool isprime[MAXN];
int primes[MAXN],tot;
void prepare(){
f[1]=1;
f2[1]=1;
f3[1]=1;
for(int i=2;i<=MAXP;i++){
if(isprime[i]==0){
primes[++tot]=i;
f[i]=i-2;
las[i]=1;
ti[i]=1;
f2[i]=i;
f3[i]=i;
}
for(int j=1;1ll*primes[j]*i<=1ll*MAXP;j++){
isprime[i*primes[j]]=1;
if(i%primes[j]==0){
las[i*primes[j]]=las[i];
int x=las[i];
int p=primes[j];
int px=i*primes[j]/las[i];
f[i*primes[j]]=(px-2*px/p+px/p/p)*f[x];
ti[i*primes[j]]=ti[i]+1;
f2[i*primes[j]]=f2[i];
if(ti[i]%2==0)
f2[i*primes[j]]*=primes[j];
f3[i*primes[j]]=f3[i];
if(ti[i]%3==0)
f3[i*primes[j]]*=primes[j];
break;
}
las[i*primes[j]]=i;
ti[i*primes[j]]=1;
f[i*primes[j]]=f[i]*f[primes[j]];
f2[i*primes[j]]=f2[i]*f2[primes[j]];
f3[i*primes[j]]=f3[i]*f3[primes[j]];
}
}
}
int main(){
prepare();
SF("%d",&n);
int A,B,C;
while(n--){
SF("%d%d%d",&A,&B,&C);
int ans=0;
for(int i=1;i<=A;i++)
ans+=f[i]*(A/i)*(B/f2[i])*(C/f3[i]);
PF("%d\n",ans&((1<<30)-1));
}
}