Summe der Reihe: 1^1 + 2^2 + 3^3 + ... + n^n (mod m)

Kann mir jemand eine Idee für einen effizienten Algorithmus für großes n (etwa 10^10) zu finden, die Summe der oben genannten Serie?

Mycode ist immer klilled für n= 100000 und 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);

}
kann u verwenden Sie java?
Aviator: Effiziente algorithmen sind in der Regel unabhängig von der Sprache. Sollte nicht wirklich eine Rolle, ob diese in Java, oder C (ausser vielleicht ein linearer Faktor in der Laufzeit).
Ich verstehe. Ich dachte, der darauf hindeutet, BigInteger. Thats, warum gefragt
Sie sagen, Sie wollen etwas schnelles für große n (10^10), aber Sie nicht sagen, ob m ist ebenso groß, oder wenn es bleibt etwa 200k. Es ist vielleicht auch egal, denn wenn m klein ist, dann können Sie versuchen, pre-Berechnung/caching einige Begriffe. Wenn Sie bereits wissen, a^m^a für alle a kleiner als m, dann wenn Sie kommen, um zu berechnen, (m+2)^(m+2), dann ist es nur 2^(m+2) = 2^m*2^2. Dann (m+3)^(m+3) = 3^x*3^3 und so weiter. Sie können wahrscheinlich Dinge so anzuordnen, dass Sie immer Zugriff auf Ihre gespeicherten Werte nacheinander, nicht sicher.
Denken Sie daran, Sie möchten vielleicht auch cache 1^2m ... (m-1)^2m als auch, während, du bist der Berechnung der 2m+1 ... 3m-1 Bedingungen. Dann verwenden Sie diese Werte zur Berechnung 1^3m ... (m-1)^3m, und ersetzen Sie den gespeicherten Wert mit dem neuen Wert für die Verwendung in der Berechnung von 1^4 m ... (m-1)^4m. Ohne den code zu schreiben ich habe keine Ahnung, ob das tatsächlich schneller sein, als Mehrdad ist solutino, aber es sei denn, ich habe etwas verpasst fatal, es ist O(n) statt O(n log n). Offensichtlich erfordert O(m) Speicher obwohl.

InformationsquelleAutor | 2009-10-01

Schreibe einen Kommentar