警示后人:论这题有多卡精度
查看原帖
警示后人:论这题有多卡精度
642173
KarmaticEnding楼主2025/1/15 08:52

你都看到这里了,说明你应该想到这道题的思路了吧。

那么,如果你两次取 sqrt\texttt{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\texttt{\color{Green}{AC}}\times 12+\texttt{\color{Red}{WA}}\times 11,而且是一个 AC\texttt{\color{Green}{AC}} 一个 WA\texttt{\color{Red}{WA}} 交错着来,很美观。

那么你说,我不取两次 sqrt\texttt{sqrt} 了,我只取一个 sqrt\texttt{sqrt} 总行吧,循环那个上界我用 i*i*i*i 替代了。其实也不行,你会 WA\texttt{\color{Red}{WA}} 一个点。

正确的做法是:手写 sqrt\texttt{sqrt}。可以用二分,也可以这样做:

long long sqrtL(long long &x){
	long double xx=x;
	xx=sqrt(xx);
	return xx;
}
2025/1/15 08:52
加载中...