传送门
令
g
(
n
)
=
n
2
−
3
n
+
2
g(n)=n^2-3n+2
g(n)=n2−3n+2,则有
g
=
f
∗
I
⇒
f
=
g
∗
μ
⇒
∑
i
=
1
n
f
(
i
)
=
∑
i
=
1
n
(
∑
d
∣
i
d
2
μ
(
i
d
)
−
3
∑
d
∣
i
d
μ
(
i
d
)
+
2
[
i
=
1
]
)
g=f*I\Rightarrow f=g*\mu\Rightarrow \sum_{i=1}^nf(i)=\sum_{i=1}^n(\sum_{d\mid i}d^2\mu(\frac id)-3\sum_{d\mid i}d\mu(\frac id)+2[i=1])
g=f∗I⇒f=g∗μ⇒∑i=1nf(i)=∑i=1n(∑d∣id2μ(di)−3∑d∣idμ(di)+2[i=1])。
然后预处理前
n
2
3
n^{\frac 23}
n32的
∑
d
∣
n
d
2
μ
(
n
d
)
\sum_{d\mid n}d^2\mu(\frac nd)
∑d∣nd2μ(dn)与
∑
d
∣
n
d
μ
(
n
d
)
\sum_{d\mid n}d\mu(\frac nd)
∑d∣ndμ(dn)的前缀和(这两个都是积性函数,很容易线性筛它们的值然后再求前缀和),前面那个式子还可以化,可以化成
∑
i
=
1
n
f
(
i
)
=
∑
d
=
1
n
d
2
∑
i
=
1
⌊
n
d
⌋
μ
(
i
)
−
3
∑
d
=
1
n
d
∑
i
=
1
⌊
n
d
⌋
μ
(
i
)
+
2
\sum_{i=1}^nf(i)=\sum_{d=1}^nd^2\sum_{i=1}^{\lfloor\frac nd\rfloor}\mu(i)-3\sum_{d=1}^nd\sum_{i=1}^{\lfloor \frac nd\rfloor}\mu(i)+2
∑i=1nf(i)=∑d=1nd2∑i=1⌊dn⌋μ(i)−3∑d=1nd∑i=1⌊dn⌋μ(i)+2。因此还要预处理
μ
(
n
)
\mu(n)
μ(n)的前
n
2
3
n^{\frac 23}
n32的前缀和,然后对于更大的前缀和使用杜教筛(关于
μ
(
n
)
\mu(n)
μ(n)的min_25筛求法见基础数论学习笔记(下)第十部分5.(1).例题一)。
int n,N,prim[maxn],tot,phi[maxn],f[maxn],mu[maxn];
bool flag[maxn];
unordered_map<int,int>s;
void init(int n){
mu[1]=phi[1]=f[1]=1;
FOR(i,2,n+1){
if(!flag[i])prim[tot++]=i,phi[i]=i-1,f[i]=(1ll*i*i-1)%mod,mu[i]=mod-1;
for(register int j =0;j<tot && prim[j]*i<=n;++j){
flag[i*prim[j]]=1;
if(i%prim[j]==0){
phi[i*prim[j]]=phi[i]*prim[j];
f[i*prim[j]]=1ll*f[i]*prim[j]%mod*prim[j]%mod;
break;
}
phi[i*prim[j]]=phi[i]*(prim[j]-1);
f[i*prim[j]]=1ll*f[i]*((1ll*prim[j]*prim[j]-1)%mod)%mod;
mu[i*prim[j]]=mod-mu[i];
}
}
FOR(i,1,n+1)add(f[i],f[i-1]),add(phi[i],phi[i-1]),add(mu[i],mu[i-1]);
}
int S(int n){
if(n<=N)return mu[n];
if(s.count(n))return s[n];
register int ans=1,i=2,j;
while(i<=n){
j=n/(n/i);
dec(ans,1ll*(j-i+1)*S(n/i)%mod);
i=j+1;
}
return s[n]=ans;
}
int main(){
register int t,mx=0;
rd(&t);
vector<int>a;
while(t--){
register int n;
rd(&n);
a.push_back(n);
mx=max(mx,n);
}
N=max((int)pow(mx,2.0/3.0),100000);
init(N);
FOR(t,0,a.size()){
n=a[t];
register int ans=0,i=1,j,sp=0,sf=0,s1=0,s2=0,pm=0,cur=0,s11,s22;
if(n<=N)sp=phi[n],sf=f[n];
else{
while(i<=n){
j=n/(n/i);
add(sp,1ll*((s11=sm1(j))-s1+mod)*(cur=S(n/i))%mod);
add(sf,1ll*((s22=sm2(j))-s2+mod)*cur%mod);
i=j+1,s1=s11,s2=s22;
}
}
ans=sum(sub(sf,3ll*sp%mod),2);
wrn(ans);
}
}