Ваш компилятор из всех перегрузок std::pow выбирает ту что работает с double:
double pow(double base, double exp);
double способен точно представлять целые числа в диапазоне [1, 253) - в мантиссе вещественного числа 53 бита. Если целое больше чем 253, оно округляется - младшие биты тем или иным способом исключаются/удаляются/округляются. Проверка:
522 = 2384185791015625 < 9007199254740992 = 253 - это число может быть представлено точно.
523 = 11920928955078125 > 9007199254740992 = 253 - это число "не помещается в разрядную сетку" и будет округлено, что вы и видите.
Способа заставить std::pow использовать uint64_t для вычислений и результата я не нашёл. Вам придётся написать собственную функцию.