扶苏给出的std有如下片段:
long long g = std::gcd(x * x, t), s = sqrt(g) + 0.5;
if (s * s != g) {
std::cout << "-1\n"; continue;
}
其中当 g 不为完全平方数时答案恒为 −1,因此开平方的误差不会影响答案;经本机测试,cmath库的sqrt函数对本题数据范围内的任一完全平方数开平方所得结果都是正确的,故std所用的sqrt不会被卡精度。
测试代码:无输出。
unsigned long long a,b;
for(a=1;a*a<=(1ll<<63);a++)
{
b=sqrt(a*a);
if(b!=a) printf("%llu\n",a);
}