Description
求 ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C φ ( g c d ( i , j 2 , k 3 ) ) ( m o d 2 30 ) \sum\limits_{i=1}^{A}\sum\limits_{j=1}^B\sum\limits_{k=1}^C\varphi(gcd(i,j^2,k^3))(mod\ 2^{30}) i=1∑Aj=1∑Bk=1∑Cφ(gcd(i,j2,k3))(mod 230)
Input
第一行一整数 T T T表示用例组数,每组用例输入三个整数 A , B , C ( 1 ≤ T ≤ 10 , 1 ≤ A , B , C ≤ 1 0 7 ) A,B,C(1\le T\le 10,1\le A,B,C\le 10^7) A,B,C(1≤T≤10,1≤A,B,C≤107)
Output
输出答案
Sample Input
4
96 93 95
970 906 893
92460 95043 54245
9760979 8053227 7156842
Sample Output
1114536
28070648
388873924
623507672
Solution
首先有
a
n
s
=
∑
i
=
1
A
∑
d
∣
i
φ
(
d
)
⋅
s
(
i
,
B
,
C
,
d
)
\begin{array}{lcl} ans=\sum\limits_{i=1}^A\sum\limits_{d|i}\varphi(d)\cdot s(i,B,C,d) \end{array}
ans=i=1∑Ad∣i∑φ(d)⋅s(i,B,C,d)
其中
s
(
i
,
B
,
C
,
d
)
s(i,B,C,d)
s(i,B,C,d)表示满足
g
c
d
(
i
,
j
2
,
k
3
)
=
d
,
1
≤
j
≤
B
,
1
≤
k
≤
C
gcd(i,j^2,k^3)=d,1\le j\le B,1\le k\le C
gcd(i,j2,k3)=d,1≤j≤B,1≤k≤C的二元组
(
j
,
k
)
(j,k)
(j,k)的个数
令
S
(
i
,
B
,
C
,
d
)
S(i,B,C,d)
S(i,B,C,d)表示满足
d
∣
g
c
d
(
i
,
j
2
,
k
3
)
,
1
≤
j
≤
B
,
1
≤
k
≤
C
d|gcd(i,j^2,k^3),1\le j\le B,1\le k\le C
d∣gcd(i,j2,k3),1≤j≤B,1≤k≤C的二元组
(
j
,
k
)
(j,k)
(j,k)的个数,那么有
S
(
i
,
B
,
C
,
d
)
=
∑
d
∣
n
∣
i
s
(
i
,
B
,
C
,
k
)
S(i,B,C,d)=\sum\limits_{d|n|i}s(i,B,C,k)
S(i,B,C,d)=d∣n∣i∑s(i,B,C,k)
考虑求
S
(
i
,
B
,
C
,
d
)
S(i,B,C,d)
S(i,B,C,d),也即分别求出求
d
∣
j
2
,
1
≤
j
≤
B
d|j^2,1\le j\le B
d∣j2,1≤j≤B的个数和
d
∣
k
3
,
1
≤
k
≤
C
d|k^3,1\le k\le C
d∣k3,1≤k≤C的个数
对 d d d质因子分解有 d = p 1 a 1 . . . p m a m d=p_1^{a_1}...p_m^{a_m} d=p1a1...pmam,记 f ( d ) = p 1 ⌊ a 1 + 1 2 ⌋ . . . p m ⌊ a m + 1 2 ⌋ , g ( d ) = p 1 ⌊ a 1 + 2 3 ⌋ . . . p m ⌊ a m + 2 3 ⌋ f(d)=p_1^{\lfloor\frac{a_1+1}{2}\rfloor}...p_m^{\lfloor\frac{a_m+1}{2}\rfloor},g(d)=p_1^{\lfloor\frac{a_1+2}{3}\rfloor}...p_m^{\lfloor\frac{a_m+2}{3}\rfloor} f(d)=p1⌊2a1+1⌋...pm⌊2am+1⌋,g(d)=p1⌊3a1+2⌋...pm⌊3am+2⌋,显然 f , g f,g f,g均为积性函数,且 d ∣ j 2 d|j^2 d∣j2等价于 f ( d ) ∣ j f(d)|j f(d)∣j, d ∣ k 3 d|k^3 d∣k3等价于 g ( d ) ∣ k g(d)|k g(d)∣k,故线性筛求出 f , g f,g f,g后即可 O ( 1 ) O(1) O(1)得到 S ( i , B , C , d ) = ⌊ B f ( d ) ⌋ ⋅ ⌊ C g ( d ⌋ S(i,B,C,d)=\lfloor\frac{B}{f(d)}\rfloor\cdot \lfloor\frac{C}{g(d}\rfloor S(i,B,C,d)=⌊f(d)B⌋⋅⌊g(dC⌋
之后由莫比乌斯反演有
s
(
i
,
B
,
C
,
d
)
=
∑
d
∣
n
∣
i
μ
(
n
d
)
⋅
S
(
i
,
B
,
C
,
n
)
s(i,B,C,d)=\sum\limits_{d|n|i}\mu(\frac{n}{d})\cdot S(i,B,C,n)
s(i,B,C,d)=d∣n∣i∑μ(dn)⋅S(i,B,C,n)
故有
a
n
s
=
∑
i
=
1
A
∑
d
∣
i
φ
(
d
)
∑
d
∣
n
μ
(
n
d
)
⋅
S
(
i
,
B
,
C
,
n
)
=
∑
i
=
1
A
∑
d
∣
i
φ
(
d
)
∑
d
∣
n
∣
i
μ
(
n
d
)
⋅
⌊
B
f
(
n
)
⌋
⋅
⌊
C
g
(
n
⌋
=
∑
n
=
1
A
⌊
A
n
⌋
⋅
⌊
B
f
(
n
)
⌋
⋅
⌊
C
g
(
n
⌋
∑
d
∣
n
φ
(
d
)
⋅
μ
(
n
d
)
\begin{array}{lcl} ans&=&\sum\limits_{i=1}^A\sum\limits_{d|i}\varphi(d)\sum\limits_{d|n}\mu(\frac{n}{d})\cdot S(i,B,C,n)\\ &=&\sum\limits_{i=1}^A\sum\limits_{d|i}\varphi(d)\sum\limits_{d|n|i}\mu(\frac{n}{d})\cdot \lfloor\frac{B}{f(n)}\rfloor\cdot \lfloor\frac{C}{g(n}\rfloor \\ &=&\sum\limits_{n=1}^A\lfloor\frac{A}{n}\rfloor\cdot \lfloor\frac{B}{f(n)}\rfloor\cdot \lfloor\frac{C}{g(n}\rfloor\sum\limits_{d|n}\varphi(d)\cdot \mu(\frac{n}{d})\\ \end{array}
ans===i=1∑Ad∣i∑φ(d)d∣n∑μ(dn)⋅S(i,B,C,n)i=1∑Ad∣i∑φ(d)d∣n∣i∑μ(dn)⋅⌊f(n)B⌋⋅⌊g(nC⌋n=1∑A⌊nA⌋⋅⌊f(n)B⌋⋅⌊g(nC⌋d∣n∑φ(d)⋅μ(dn)
令
h
(
n
)
=
∑
d
∣
n
φ
(
d
)
⋅
μ
(
n
d
)
h(n)=\sum\limits_{d|n}\varphi(d)\cdot \mu(\frac{n}{d})
h(n)=d∣n∑φ(d)⋅μ(dn),由于
φ
,
μ
\varphi,\mu
φ,μ都是积性函数,那么它们的狄利克雷卷积也是积性函数,故同样可以线性筛求出
h
h
h,注意到
h
(
p
)
=
φ
(
1
)
μ
(
p
)
+
φ
(
p
)
μ
(
1
)
=
p
−
2
h(p)=\varphi(1)\mu(p)+\varphi(p)\mu(1)=p-2
h(p)=φ(1)μ(p)+φ(p)μ(1)=p−2,而由
φ
(
p
c
)
=
p
c
−
p
c
−
1
\varphi(p^c)=p^c-p^{c-1}
φ(pc)=pc−pc−1以及
μ
(
p
c
)
=
0
,
c
≥
2
\mu(p^c)=0,c\ge 2
μ(pc)=0,c≥2可得
h
(
p
c
)
=
∑
i
=
0
c
φ
(
p
i
)
μ
(
p
c
−
i
)
=
φ
(
p
c
)
μ
(
1
)
+
φ
(
p
c
−
1
)
μ
(
p
)
=
p
c
−
2
p
c
−
1
+
p
c
−
2
h(p^c)=\sum\limits_{i=0}^c\varphi(p^i)\mu(p^{c-i})=\varphi(p^c)\mu(1)+\varphi(p^{c-1})\mu(p)=p^c-2p^{c-1}+p^{c-2}
h(pc)=i=0∑cφ(pi)μ(pc−i)=φ(pc)μ(1)+φ(pc−1)μ(p)=pc−2pc−1+pc−2
用线性筛
O
(
n
)
O(n)
O(n)预处理出
φ
,
μ
,
f
,
g
,
h
\varphi,\mu,f,g,h
φ,μ,f,g,h即可
O
(
A
)
O(A)
O(A)查询
Code
#include<cstdio>
using namespace std;
typedef long long ll;
#define maxn 10000005
#define mod (1<<30)
int mul(int x,int y)
{
ll z=1ll*x*y;
return z-z/mod*mod;
}
int add(int x,int y)
{
x+=y;
if(x>=mod)x-=mod;
return x;
}
int prime[maxn],res,euler[maxn],f[maxn],g[maxn],h[maxn],mu[maxn],mark[maxn];
void get_euler(int n=1e7)
{
euler[1]=mu[1]=f[1]=g[1]=h[1]=mark[1]=1;
res=0;
for(int i=2;i<=n;i++)
{
if(!euler[i])
{
euler[i]=i-1,prime[res++]=i,mu[i]=-1,f[i]=i,g[i]=i,h[i]=i-2,mark[i]=i;
}
for(int j=0;j<res&&prime[j]*i<=n;j++)
{
if(i%prime[j])
{
euler[prime[j]*i]=euler[i]*(prime[j]-1);
mu[i*prime[j]]=-mu[i];
f[i*prime[j]]=f[i]*prime[j];
g[i*prime[j]]=g[i]*prime[j];
mark[i*prime[j]]=prime[j];
h[i*prime[j]]=h[i]*h[prime[j]];
}
else
{
euler[prime[j]*i]=euler[i]*prime[j];
mu[i*prime[j]]=0;
f[i*prime[j]]=f[i/prime[j]]*prime[j];
if((i/prime[j])%prime[j]==0)g[i*prime[j]]=g[i/prime[j]/prime[j]]*prime[j];
else g[i*prime[j]]=g[i];
mark[i*prime[j]]=mark[i]*prime[j];
if(i*prime[j]==mark[i*prime[j]])
h[i*prime[j]]=add(add(i*prime[j],mod-mul(2,i)),i/prime[j]);
else
h[i*prime[j]]=h[i/mark[i]]*h[mark[i*prime[j]]];
break;
}
}
}
}
int main()
{
get_euler();
int T,A,B,C;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&A,&B,&C);
int ans=0;
for(int d=1;d<=A;d++)ans=add(ans,mul(mul(h[d],A/d),mul(B/f[d],C/g[d])));
printf("%d\n",ans);
}
return 0;
}