9644. Сумма
степеней
Найдите значение суммы
(1n + 2n + 2 * 3n + 3 * 4n + 4 * 5n + ....
+ 99 * 100n)
mod m
Вход. Два натуральных числа n и m (n, m
≤ 108).
Выход. Выведите значение суммы по модулю m.
Пример
входа |
Пример
выхода |
12345678 35242346 |
5447885 |
степень
Первые два слагаемых суммы
отличаются от остальных. Вычислим их отдельно. Далее считаем сумму в цикле по i от 3 до 100, каждое слагаемое
имеет вид (i – 1) * in.
Реализация алгоритма
Функция
powmod вычисляет значение xn mod m.
long long
powmod(long long x, long long n, long long m)
{
if (n ==
0) return 1;
if (n % 2
== 0) return powmod((x * x) % m, n / 2,
m);
return (x *
powmod(x, n - 1, m)) % m;
}
Основная
часть программы. Читаем входные данные.
scanf("%lld %lld",
&n, &m);
Вычисляем res = (1n + 2n) mod m.
res = (powmod(1, n, m) + powmod(2, n, m)) % m;
Находим остальную часть суммы.
for (i = 3; i <= 100; i++)
res = (res +
(i - 1) * powmod(i, n, m)) % m;
Выводим
ответ.
printf("%lld\n",
res);
Python реализация
Функция
myPow вычисляет значение xn mod m.
def myPow(x, n, m):
if n == 0: return 1
if n % 2 == 0: return myPow((x
* x) % m, n / 2, m)
return (x *
myPow(x, n - 1, m)) % m
Основная часть программы. Читаем входные данные.
n, m = map(int, input().split())
Вычисляем res = (1n + 2n) mod m.
res = (myPow(1, n, m)
+ myPow(2, n, m)) % m
Находим остальную часть суммы.
for i in range(3, 101):
res = (res
+ (i - 1) * myPow(i, n, m)) % m
Выводим ответ.
print(res)