Да, вы можете сделать это на C++. Как указывали другие, вы не можете это сделать напрямую. Используя небольшое падение теории чисел, можно разложить проблему на две управляемые подпрограммы.
Сначала подумайте, что 10^10 = 2^10 * 5^10
. Оба фактора являются взаимными, поэтому вы можете использовать Chinese remainder theorem, чтобы найти мощность по модулю 10^10
, используя полномочия modulo 2^10
и modulo 5^10
.
Обратите внимание, что в следующем коде были найдены магия значения u2
и u5
с помощью Extended Euclidean Algorithm. Вам не нужно программировать этот алгоритм самостоятельно, потому что эти значения являются константами. Я использую maxima и его функцию gcdex, чтобы вычислить их.
Вот модифицированная версия:
typedef unsigned long long ull;
ull const M = 10000000000ull;
ull pow_mod10_10(ull n, ull p) {
ull const m2 = 1024; // 2^10
ull const m5 = 9765625; // 5^10
ull const M2 = 9765625; // 5^10 = M/m2
ull const M5 = 1024; // 2^10 = M/m5
ull const u2 = 841; // u2*M2 = 1 mod m2
ull const u5 = 1745224; // u5*M5 = 1 mod m5
ull b2 = 1;
ull b5 = 1;
ull n2 = n % m2;
ull n5 = n % m5;
while(p) {
if(p%2 == 1) {
b2 = (b2*n2)%m2;
b5 = (b5*n5)%m5;
}
n2 = (n2*n2)%m2;
n5 = (n5*n5)%m5;
p /= 2;
}
ull np = (((b2*u2)%M)*M2)%M;
np += (((b5*u5)%M)*M5)%M;
np %= M;
return np;
}
Использование мульти-прецизионный библиотека как GMP. –