algorithm - 序列总和 : 1^1 + 2^2 + 3^3 + . .. + n^n (mod m)

标签 algorithm series

谁能给我一个大 n(比如 10^10)的有效算法的想法,以找到上述系列的总和?

Mycode 在 n=100000 和 m=200000 时被杀死

#include<stdio.h>

int main() {
    int n,m,i,j,sum,t;
    scanf("%d%d",&n,&m);
    sum=0;
    for(i=1;i<=n;i++) {
        t=1;
        for(j=1;j<=i;j++)
            t=((long long)t*i)%m;
        sum=(sum+t)%m;
    }
    printf("%d\n",sum);

}

最佳答案

两个注意事项:

(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)。

关于algorithm - 序列总和 : 1^1 + 2^2 + 3^3 + . .. + n^n (mod m),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282808/

相关文章:

algorithm - 以函数式风格移除元素

string - 名称匹配的字符串相似性

python - Pandas 中的 `Series.replace()` 和 `Series.map()` 有区别吗?

SAS 9.3 Proc Rank 问题(Rank/Sort Road Block)

python - 如何将带有 1 个主列的 Pandas DataFrame 对象转换为带有原始 DataFrame 索引列的 Pandas 系列

algorithm - 我需要为此实现 b 树搜索吗?

c# - 让 Levenstein 的距离算法满足我的需要

algorithm - 在图中查找相邻边

python - 将 Pandas 数据框列映射到字典

javascript - 折线图系列向下钻取到另一个折线图系列