Trong C++ không có gì đảm bảo độ chính xác của số thực khi ta phải thao tác với số cực lớn, vậy nên cần có cách xử lý những trường hợp này (hàm pow và hàm sqrt là hai hàm phổ biến nhưng lại trả về số thực)

Xử lý với hàm sqrt:

Vì sqrt khi xử lý số lớn sẽ trả về sai số nên ta sẽ kiểm tra 3 số lân cận

long long getSqrt(unsigned long long x)
{
	long long temp = sqrt(x);
	for(int i=-3; i<=3; i++)
	{
		if(temp + i >= 0 && (temp + i)*(temp + i) == x)
		{
			return temp + i;
		}
	}
	return -1;
}

Ngoài ra có hàm pow, nhưng đã có hướng dẫn trong bài lỹ thừa nhị phân

Tìm căn bậc 2 bằng binary search

long long find_sqrt(long long x)
{
    if(x==1) return 1;
    long long l = 0, r = min(x, 1000000000ll);
    long long mid = (l+r)/2;
    while(l < r)
    {
        if(mid*mid <= x && (mid+1)*(mid+1) > x) return mid;
        else if(mid*mid > x) r = mid;
        else l = mid+1;
        mid = (l+r)/2;
    }
}