Somme de la série: 1^1 + 2^2 + 3^3 + ... + n^n (mod m)

Quelqu'un peut-il me donner une idée d'un algorithme efficace pour n grand (disons 10^10) pour trouver la somme de la série ci-dessus?

Mycode est arriver klilled pour n= 100000 et 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);

}
u peut utiliser java?
L'aviateur: algorithmes Efficaces sont généralement indépendants de la langue. Ne devrait pas vraiment d'importance si c'est Java ou C (à l'exception peut-être un facteur linéaire dans l'exécution).
Je comprends. J'ai pensé à ce qui suggère BigInteger. C'est pourquoi demandé
Vous dites que vous voulez quelque chose de rapide pour big n (10^10), mais vous ne dites pas si m est de même taille, ou si elle reste autour de 200k. Il peut d'importance, parce que si m est petit, alors vous pouvez essayer de pré-calcul/la mise en cache de certains termes. Si vous connaissez déjà un^m^a pour tous les moins de m, alors quand vous venez à calculer (m+2)^(m+2) ensuite, c'est juste 2^(m+2) = 2^m*2^2. Alors (m+3)^(m+3) = 3^m*3^3 et ainsi de suite. Vous pouvez probablement arranger les choses pour vous que vous avez toujours accès à vos valeurs stockées séquentiellement, pas sûr.
Penser à ce sujet, vous pouvez également le cache de 1^2m ... (m-1)^2m ainsi, alors que vous êtes le calcul de la 2m+1 ... 3m-1 termes. Utilisez ces valeurs pour calculer 1^3m ... (m-1)^3 m, et de remplacer la valeur stockée avec la nouvelle valeur pour le calcul de 1^4m ... (m-1)^4m. Sans écrire le code que j'ai aucune idée si ce sera effectivement plus rapide que Mehrdad de solutino, mais à moins que j'ai raté quelque chose de fatal, c'est O(n) au lieu de O(n log n). Il faut, évidemment, O(m) de la mémoire.

OriginalL'auteur | 2009-10-01