杜教筛
int summu(int n){
if(n<=maxn) return mu[n];
if(smu.find(n)!=smu.end()) return smu[n];
int sh=1;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
sh-=(r-l+1)*summu(n/l);
}
return smu[n]=sh;
}
int sumphi(int n){
if(n<=maxn) return phi[n];
if(sphi.find(n)!=sphi.end()) return sphi[n];
int sh=(1+n)*n/2;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
sh-=(r-l+1)*sumphi(n/l);
}
return sphi[n]=sh;
}

浙公网安备 33010602011771号