print 10**1000 % 7
В CI получить синтаксическую ошибку, потому что она превышает ограничение памяти, я думаю. Могу ли я как-то решить это легко на C или C++, чтобы он дал мне по модулю 10 к мощности 1000?
В дополнение к тому, что не является синтаксисом в C/C++, это плохой практикой в python.
Если вы это сделаете
pow(10,1000,7)
Он будет использовать модульное возведение в степень, поэтому он будет намного быстрее, чем делать
10 ** 1000 % 7
pow
?
вы можете использовать pow
для питания. здесь размер результата - большое значение, поэтому вам нужно разделить проблему на меньшую часть и решить меньшие, чтобы получить решение в c, или вам нужно будет обрабатывать большие числа.
вы можете применять правила модуля, чтобы уменьшить проблему, поскольку,
10^1000 % 7 =((10%7)^1000)%7
10^1000 % 7 =(((((10^10)%7)^10)%7)^10)%7
объединить эти правила и использовать, чтобы уменьшить числа, сгенерированные шагами (mod 10). Использовать встроенную функцию pow()
в c, чтобы получить мощность числа как X ^ y = pow (x, y)
a
и p
взаимно просты. Контрпример - 2 ^ 10 (мод 8)! = 2 ^ 2 (мод 8)
Самый общий способ решения этих типов задач с большими целыми числами в небольших (например, 32-разрядных) регистрах - это возведение в степень возведения в квадрат и принятие по модулю на каждом шаге. Например, 10 ^ 10 по-прежнему слишком велика, чтобы вписаться в 32-битный int, хотя в наши дни вы, вероятно, просто используете длинный.
Самый простой способ сделать это - уменьшить члены по модулю. Общая формула
a b mod c ≡ (mod c) (b mod φ (c)) mod c
Поэтому в этом случае вы получаете
10 1000 mod 7 = (10 mod 7) (1000 mod φ (7)) mod 7.
10 mod 7 = 3
φ (7) = 6
1000 mod 6 = 4
3 4= 81
81 mod 7 = 4
поэтому 10 1000 mod 7 = 4
В C (и C++ слишком AFAIK) это недействительный синтаксис. Вы можете использовать функцию pow
для возведения в степень. Но имейте в виду, что возвращаемое значение pow
double
а оператор modulo работает для int
. Вам нужны предостережения.
long result = (long)pow(10, 1000);
result = result % 7;
**
, вы должны использовать функцию pow
, которая, однако, работает только для типов с плавающей точкой; и оператор% работает только для интегральных типов, для типов FP вам нужно использовать fmod
;1En
(скажем, 1E42
);fmod
на нем из-за конечной точности мантиссы.Итак, как это работает Python? Под капотом, за пределами "обычных" типов, используется библиотека произвольной точности. Вы можете сделать то же самое в своей C++ программе, предоставляя такую библиотеку (например, вы можете использовать GMP).
Но: выражение, которое вы предоставляете, может быть рассчитано без фактического вычисления 10 ** 1000 и его модуля. Чтение мощности модуля больших чисел
long
пробовал?