Две ноты:
(a + b + c) % m
эквивалентно
(a % m + b % m + c % m) % m
и
(a * b * c) % m
эквивалентно
((a % m) * (b % m) * (c % m)) % m
В результате вы можете вычислить каждый член, используя рекурсивную функцию в O (log p ):
int expmod(int n, int p, int m) {
if (p == 0) return 1;
int nm = n % m;
long long r = expmod(nm, p / 2, m);
r = (r * r) % m;
if (p % 2 == 0) return r;
return (r * nm) % m;
}
И суммируйте элементы, используя цикл for
:
long long r = 0;
for (int i = 1; i <= n; ++i)
r = (r + expmod(i, i, m)) % m;
Этот алгоритм O ( n log n ).