SPOJ Problem KPRIMES2

8

Ich bin neu in diesem Forum und nicht sehr bewusst Protokolle dieses Forums so entschuldigen Sie mich für meine Ignoranz. Meine Frage bezieht sich auf das Problem Ссылка . Ich bekomme Zeitlimit überschritten für dieses Problem.Ich denke, der Engpass dieses Programms erzeugt 10 ^ 9.Could einige vorschlagen, wie dieses Sieb zu verbessern, schneller Weg, um Prime oder wie dieses Problem zu lösen. Hier ist eine Skizze meines Algorithmus

Dieses Programm erzeugt alle Primzahlen der Form 2k + 1 und codiert diese Primzahlen in 32-Bit-Integer des Arrays a [i], in denen das nicht gesetzte Bit Primzahlen darstellt. a [0] codiert 3,5,7 ..... ..65.a [1] codiert ab 67 und so weiter. Ich habe ein Hilfsfeld bitcnt [] genommen, in dem bitcnt [i] die Summe der nicht gesetzten Bits von [0], a [1], ......... a [i] speichert. Ich benutzte Bitcnt für die binäre Suche und finde die Position der k-ten Zahl. Hier ist eine Erklärung der Funktionen. prime () - Funktion generierte Primzahlen und ich kodierte die Primzahlen auf Bits der Zahl [32 Bit unsigned integer]. Das bitcnt-Array speichert die Summe der nicht gesetzten Bits des Arrays a für die binäre Suche. bsearchupper (int m) gibt den Index von bitcnt zurück, in dem m liegt. Schließlich speichere ich in der Hauptfunktion, wie viele Primzahlen bis in den oberen Bereich von m gehen, und beginne, den Wert zu verringern, bis ich K erhalten habe. Danke.

Bearbeiten: Problemstellung von SPOJ

Eingabe

Eine Ganzzahl mit der Anzahl der Abfragen Q (entspricht 100000) und Q-Zeilen folgen, die jeweils eine Ganzzahl K zwischen 1 und einschließlich 50000000 enthalten.

Ausgabe

Q-Zeilen mit der Antwort jeder Abfrage: die K-te Primzahl.

Beispiel

Eingabe: 8 1 10 100 1000 10000 100000 1000000 10000000

Ausgabe: 2 29 541 7919 104729 1299709 15485863 179424673

%Vor%     
keep_learning 28.01.2011, 05:31
quelle

1 Antwort

2

Erwägen Sie, Ihren Prime-Speicher noch weiter zu verdichten. Zum Beispiel gibt es in jedem Block von 2 * 3 * 5 * 7 * 11 = 2310 genau 1 * 2 * 4 * 6 * 10 = 480 Zahlen, die keinen Primfaktor von 11 oder weniger haben, die Sie in 15 packen können Array-Einträge statt (etwa) 36. Das wird ein paar hundert Millionen Bit-Operationen eliminieren, die diese kleinen Faktoren herausfiltern. Sie müssen Ihre Indizierung in das Bit-Array ändern. ein Paar konstanter Felder der Länge 2310, die den Bit-Index (falls vorhanden) und den Array-Element-Offset ergeben, helfen hier, und ein ähnliches Array (der Länge 480) wandelt die Bit-Positionen zurück in die Werte mod 2310.

    
Chris Nash 22.02.2011, 20:24
quelle