一尘不染

级数之和:1 ^ 1 + 2 ^ 2 + 3 ^ 3 +…+ n ^ n(mod m)

algorithm

有人可以给我一个关于大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);

}

阅读 367

收藏
2020-07-28

共1个答案

一尘不染

两个注意事项:

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

2020-07-28