你都看到这里了,说明你应该想到这道题的思路了吧。
那么,如果你两次取 sqrt:
long long m;
m=sqrt(n);k=sqrt(m);
unsigned long long ans=0;
for(long long i=1;i<=k;++i){
ans=ans+f[i]*(m-i*i+1);
}
printf("%llu",ans);
你会喜提 AC×12+WA×11,而且是一个 AC 一个 WA 交错着来,很美观。
那么你说,我不取两次 sqrt 了,我只取一个 sqrt 总行吧,循环那个上界我用 i*i*i*i 替代了。其实也不行,你会 WA 一个点。
正确的做法是:手写 sqrt。可以用二分,也可以这样做:
long long sqrtL(long long &x){
long double xx=x;
xx=sqrt(xx);
return xx;
}