两个注意事项:
(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 )。



