题目大意

解题思路
ans=∑ni=1∑d|i[(d,i/d)==1]
因为2f(i)相当于从i的质因子中考虑选不选进一个数里,要么选要么不选,等同于拆成两个互质的数。
ans=∑ni=1∑d|i∑p|d&&p|(i/d)[(d,i/d)==1]
如果(d,i/d)!=1那它约数的mu和为0,如果是1则mu和为1。
ans=∑ni=1∑p2|ig(i/p2)μ(p)
可以发现i的因子一定含有两个p,而i的其他因子可以随便组合成i的因数。
ans=∑sqrt(n)p=1μ(p)∑n/p2i=1g(i)
交换主体
ans=∑sqrt(n)p=1μ(p)∑n/p2i=1n/(p2i)
剩下的线筛加分快即可。
code
using namespace std;
LL const mn=1e6+9,mo=998244353;
LL n,ss[mn],tag[mn],mu[mn];
int main(){
scanf("%lld",&n);LL nn=sqrt(n);mu[1]=1;
fo(i,2,nn){
if(!tag[i])ss[++ss[0]]=i,mu[i]=-1;
fo(j,1,ss[0]){
if(i*ss[j]>nn)break;
tag[i*ss[j]]=1;
if(i%ss[j]==0){
mu[i*ss[j]]=0;
break;
}else mu[i*ss[j]]=-mu[i];
}
}
LL ans=0;
fo(i,1,nn){
LL mm=n/i/i;
for(LL j=1,k;j<=mm;j=k+1){
k=mm/(mm/j);
ans=(ans+mu[i]*mm/j%mo*((k-j+1)%mo))%mo;
}
}
printf("%lld",(ans+mo)%mo);
return 0;
}