再化简公式前,先介绍一下强化版的欧拉函数积性公式
ϕ
(
n
m
)
=
ϕ
(
n
)
ϕ
(
m
)
G
C
D
(
n
,
m
)
ϕ
(
G
C
D
(
n
,
m
)
)
\phi(nm)=\phi(n)\phi(m)\frac{GCD(n,m)}{\phi(GCD(n,m))}
ϕ(nm)=ϕ(n)ϕ(m)ϕ(GCD(n,m))GCD(n,m)
如下是详细的化简过程
原式
=
∑
i
=
1
n
∑
j
=
1
n
∑
k
=
1
n
j
k
2
ϕ
(
g
c
d
(
i
,
j
,
k
)
)
= \sum\limits _{i=1}^{n}\sum\limits _{j=1}^{n}\sum\limits _{k=1}^{n}jk^{2}\phi (gcd(i,j,k))
=i=1∑nj=1∑nk=1∑njk2ϕ(gcd(i,j,k))
= ∑ d = 1 n ϕ ( d ) ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j k 2 [ g c d ( i , j , k ) = d ] =\sum\limits _{d=1}^{n}\phi (d)\sum\limits _{i=1}^{n}\sum\limits _{j=1}^{n}\sum\limits _{k=1}^{n}jk^{2}[gcd(i,j,k)=d] =d=1∑nϕ(d)i=1∑nj=1∑nk=1∑njk2[gcd(i,j,k)=d]
= ∑ d = 1 n ϕ ( d ) d 3 ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ ∑ k = 1 ⌊ n d ⌋ j k 2 [ g c d ( i , j , k ) = 1 ] =\sum\limits _{d=1}^{n}\phi (d) d^{3}\sum\limits _{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits _{j=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits _{k=1}^{\left \lfloor \frac{n}{d} \right \rfloor}j k^{2}[gcd(i,j,k)=1] =d=1∑nϕ(d)d3i=1∑⌊dn⌋j=1∑⌊dn⌋k=1∑⌊dn⌋jk2[gcd(i,j,k)=1]
设 f ( x ) = ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ ∑ k = 1 ⌊ n d ⌋ j k 2 [ g c d ( i , j , k ) = x ] f(x)=\sum\limits _{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits _{j=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits _{k=1}^{\left \lfloor \frac{n}{d} \right \rfloor}j k^{2}[gcd(i,j,k)=x] f(x)=i=1∑⌊dn⌋j=1∑⌊dn⌋k=1∑⌊dn⌋jk2[gcd(i,j,k)=x]
又设 g ( x ) = ∑ x ∣ d f ( d ) = ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ ∑ k = 1 ⌊ n d ⌋ j k 2 [ x ∣ g c d ( i , j , k ) ] g(x)=\sum\limits _{x|d}^{ }f(d)=\sum\limits _{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits _{j=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits _{k=1}^{\left \lfloor \frac{n}{d} \right \rfloor}j k^{2}[x|gcd(i,j,k)] g(x)=x∣d∑f(d)=i=1∑⌊dn⌋j=1∑⌊dn⌋k=1∑⌊dn⌋jk2[x∣gcd(i,j,k)]
则 g ( x ) = x 3 ∑ i = 1 ⌊ n x d ⌋ ∑ j = 1 ⌊ n x d ⌋ ∑ k = 1 ⌊ n x d ⌋ j k 2 [ 1 ∣ g c d ( i , j , k ) ] g(x)=x^{3}\sum\limits _{i=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}\sum\limits _{j=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}\sum\limits _{k=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}j k^{2}[1|gcd(i,j,k)] g(x)=x3i=1∑⌊xdn⌋j=1∑⌊xdn⌋k=1∑⌊xdn⌋jk2[1∣gcd(i,j,k)]
= x 3 ∑ i = 1 ⌊ n x d ⌋ 1 ∑ j = 1 ⌊ n x d ⌋ j ∑ k = 1 ⌊ n x d ⌋ k 2 =x^{3}\sum\limits _{i=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}1\sum\limits _{j=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}j\sum\limits _{k=1}^{\left \lfloor \frac{n}{xd} \right \rfloor}k^{2} =x3i=1∑⌊xdn⌋1j=1∑⌊xdn⌋jk=1∑⌊xdn⌋k2
= x 3 ⌊ n x d ⌋ ( 1 + ⌊ n x d ⌋ ) ⌊ n x d ⌋ 2 ( 1 + ⌊ n x d ⌋ ) ⌊ n x d ⌋ ( 2 ⌊ n x d ⌋ + 1 ) 6 =x^{3} \left \lfloor \frac{n}{xd} \right \rfloor \frac{(1+\left \lfloor \frac{n}{xd} \right \rfloor) \left \lfloor \frac{n}{xd} \right \rfloor}{2} \frac{(1+\left \lfloor \frac{n}{xd} \right \rfloor) \left \lfloor \frac{n}{xd} \right \rfloor (2 \left \lfloor \frac{n}{xd} \right \rfloor+1)}{6} =x3⌊xdn⌋2(1+⌊xdn⌋)⌊xdn⌋6(1+⌊xdn⌋)⌊xdn⌋(2⌊xdn⌋+1)
莫比乌斯反演:
f
(
x
)
=
∑
x
∣
d
μ
(
d
x
)
∗
g
(
d
)
f(x)=\sum\limits _{x|d}^{ }\mu(\frac{d}{x})*g(d)
f(x)=x∣d∑μ(xd)∗g(d)
f ( 1 ) = ∑ 1 ∣ d μ ( d 1 ) g ( d ) = ∑ i = 1 ⌊ n d ⌋ μ ( d ) g ( d ) f(1)=\sum\limits _{1|d}^{ }\mu(\frac{d}{1}) g(d)=\sum\limits _{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu(d) g(d) f(1)=1∣d∑μ(1d)g(d)=i=1∑⌊dn⌋μ(d)g(d)
原式 = ∑ d = 1 n ϕ ( d ) d 3 ∑ i = 1 ⌊ n d ⌋ μ ( i ) i 3 ⌊ n i d ⌋ ( 1 + ⌊ n i d ⌋ ) ⌊ n i d ⌋ 2 ( 1 + ⌊ n i d ⌋ ) ⌊ n i d ⌋ ( 2 ⌊ n i d ⌋ + 1 ) 6 = \sum\limits _{d=1}^{n}\phi (d) d^{3}\sum\limits _{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu (i) i^{3} \left \lfloor \frac{n}{id} \right \rfloor \frac{(1+\left \lfloor \frac{n}{id} \right \rfloor) \left \lfloor \frac{n}{id} \right \rfloor}{2} \frac{(1+\left \lfloor \frac{n}{id} \right \rfloor) \left \lfloor \frac{n}{id} \right \rfloor (2 \left \lfloor \frac{n}{id} \right \rfloor+1)}{6} =d=1∑nϕ(d)d3i=1∑⌊dn⌋μ(i)i3⌊idn⌋2(1+⌊idn⌋)⌊idn⌋6(1+⌊idn⌋)⌊idn⌋(2⌊idn⌋+1)
设T = id ,将 i 的求和变为 T 的求和:
∑
T
=
1
n
[
⌊
n
T
⌋
(
1
+
⌊
n
T
⌋
)
⌊
n
T
⌋
2
(
1
+
⌊
n
T
⌋
)
⌊
n
T
⌋
(
2
⌊
n
T
⌋
+
1
)
6
∑
d
∣
T
(
T
d
)
3
μ
(
d
)
d
3
ϕ
(
T
d
)
]
\sum\limits _{T=1}^{n}\bigg[\left \lfloor \frac{n}{T} \right \rfloor \frac{(1+\left \lfloor\frac{n}{T} \right \rfloor) \left \lfloor \frac{n}{T} \right \rfloor}{2} \frac{(1+\left \lfloor \frac{n}{T} \right \rfloor) \left \lfloor \frac{n}{T} \right \rfloor (2 \left \lfloor\frac{n}{T} \right \rfloor+1)}{6} \sum\limits _{d|T}^{ }(\frac{T}{d})^{3}\mu (d) d^{3} \phi (\frac{T}{d})\bigg]
T=1∑n[⌊Tn⌋2(1+⌊Tn⌋)⌊Tn⌋6(1+⌊Tn⌋)⌊Tn⌋(2⌊Tn⌋+1)d∣T∑(dT)3μ(d)d3ϕ(dT)]
先利用欧拉筛法求出右边的狄利克雷卷积,再用数论分块的方式求出整体的值。筛法的时间复杂度是o(n),求和的时间复杂度是o(n1/2),总的时间复杂度是o(n)。
先讲一下线性筛的思路:
令
f
(
x
)
=
∑
d
∣
x
(
x
d
)
3
ϕ
(
x
d
)
μ
(
d
)
d
3
f(x)=\sum\limits _{d|x}^{ }(\frac{x}{d})^{3} \phi (\frac{x}{d}) \mu (d) d^{3}
f(x)=d∣x∑(dx)3ϕ(dx)μ(d)d3
- x x x为素数时, f ( x ) = x 3 ( x − 2 ) f(x)=x^{3} (x-2) f(x)=x3(x−2)
-
x
x
x为合数时
- x x x只含一个素因子 p p p, f ( x ) = f ( x p p ) = f ( x p ) f ( p ) f(x)=f(\frac{x}{p} p)=f(\frac{x}{p}) f(p) f(x)=f(pxp)=f(px)f(p)
-
x
x
x含两个素因子
p
p
p
1. x p 2 = 1 \frac{x}{p^{2}}=1 p2x=1时, f ( x ) = f ( x p 2 p 2 ) = f ( x p 2 ) f ( p 2 ) = f ( p 2 ) = p 6 ( p − 1 ) 2 f(x)=f(\frac{x}{p^{2}} p^{2})=f(\frac{x}{p^{2}}) f(p^{2})=f(p^{2})=p^{6} (p-1)^{2} f(x)=f(p2xp2)=f(p2x)f(p2)=f(p2)=p6(p−1)2
2. x p 2 ≠ 1 \frac{x}{p^{2}}\not=1 p2x=1时, f ( x ) = f ( x p 2 p 2 ) = f ( x p 2 ) f ( p 2 ) f(x)=f(\frac{x}{p^{2}} p^{2})=f(\frac{x}{p^{2}}) f(p^{2}) f(x)=f(p2xp2)=f(p2x)f(p2) - x x x含三个及以上的素因子 p p p时, f ( x ) = ∑ d ∣ x ( x d ) 3 ϕ ( x d ) μ ( d ) d 3 = ∑ d ∣ x ( x p p d ) 3 ϕ ( x p p d ) μ ( d ) d 3 = p 4 ∑ d ∣ x p ( x p d ) 3 ϕ ( x p d ) μ ( d ) d 3 = p 4 f ( x p ) f(x)=\sum\limits _{d|x}^{ }(\frac{x}{d})^{3} \phi (\frac{x}{d}) \mu (d) d^{3}=\sum\limits _{d|x}^{ }(\frac{\frac{x}{p} p}{d})^{3} \phi (\frac{\frac{x}{p} p}{d}) \mu (d) d^{3}=p^{4} \sum\limits _{d|\frac{x}{p}}^{ }(\frac{\frac{x}{p}}{d})^{3} \phi (\frac{\frac{x}{p}}{d}) \mu (d) d^{3}=p^{4} f(\frac{x}{p}) f(x)=d∣x∑(dx)3ϕ(dx)μ(d)d3=d∣x∑(dpxp)3ϕ(dpxp)μ(d)d3=p4d∣px∑(dpx)3ϕ(dpx)μ(d)d3=p4f(px)
注意:上述表达中,用函数表达的都是已经算过的,直接拿来用就行了
接下来再讲一下数论分块的思路
数论分块有一道经典的例题,计算
∑
i
=
1
n
k
(
m
o
d
i
)
\sum\limits _{i=1}^{n}{k}(\mod{i})
i=1∑nk(modi)
以
n
=
k
=
10
n=k=10
n=k=10为例,
k
(
m
o
d
i
)
{k}(\mod{i})
k(modi)分布如下
10
5
3
2
2
1
1
1
1
1
10\;5\;3\;2\;2\;1\;1\;1\;1\;1
10532211111
这个序列是非递增序列,且有很多等值区间,可以证明最多有
2
k
2 \sqrt{k}
2k个不同的数。那么可以化加法为乘法,一次性求出等值区间的和,将时间复杂度从
o
(
n
)
o(n)
o(n),降为
o
(
n
1
2
)
o(n^{\frac{1}{2}})
o(n21)。
有了这个基础之后,就可以类似的思想对和式进行分块,可以降低时间复杂度。
注意:在模下作除法要谨慎,因为2、6与模不互素,求不了逆元,所以要先作除法再取模,因为这个wa了很多次555…
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const ll MAXN=1e7+10;
const ll MOD=1ll<<30;
ll FG[MAXN]={0,1},pri[MAXN],jud[MAXN],cnt,loop,n,sum;
ll QM(ll a,ll b){
ll res=1,rem=a;
while(b){
if(b&1) res=(res*rem)%MOD;
rem=(rem*rem)%MOD;
b>>=1;
}
return res;
}
void euler(){
memset(jud,0,sizeof(jud));
cnt=0;
for(ll i=2;i<MAXN;i++){
if(!jud[i]){
pri[cnt++]=i;
FG[i]=QM(i,3)*(i-2)%MOD;
}
for(ll j=0;j<cnt&&i*pri[j]<MAXN;j++){
jud[i*pri[j]]=1;
if(i%pri[j]==0){
if((i/pri[j])%pri[j]==0) FG[i*pri[j]]=FG[i]*QM(pri[j],4)%MOD;
else if(i/pri[j]==1) FG[i*pri[j]]=QM(pri[j],6)*QM(pri[j]-1,2)%MOD;
else FG[i*pri[j]]=FG[i/pri[j]]*FG[pri[j]*pri[j]]%MOD;
break;
}
FG[i*pri[j]]=FG[i]*FG[pri[j]]%MOD;
}
}
for(ll i=2;i<MAXN;i++) FG[i]=(FG[i]+FG[i-1])%MOD;
}
int main(){
euler();
scanf("%lld",&loop);
while(loop--){
scanf("%lld",&n);
sum=0;
for(ll i=1,r=0;i<=n;i=r+1){
ll t=n/i;
r=n/t;
ll A=(1+t)*t/2;
ll B=(2*t+1)%3?A/3%MOD*(2*t+1)%MOD:(2*t+1)/3%MOD*A%MOD;
sum=(sum+(FG[r]-FG[i-1]+MOD)%MOD*t%MOD*(A%MOD)%MOD*B%MOD)%MOD;
}
printf("%lld\n",sum);
}
return 0;
}