W moim projekcie jest jedna część problemu. Ale aby uprościć, tutaj problem jest formułowany. Istnieją dwie dodatnie liczby całkowite "co-prime": a
i b
, gdzie a < b
. Wyświetlane są wielokrotności a
od 1 do b-1
, po których następuje operacja modulowania przez b
.Szybki algorytm/formuła dla zakresu szeregowego modulo liczb pierwszych co-pr.
a mod b
, 2*a mod b
, 3*a mod b
, ... (b-1)*a mod b
Teraz jest inna liczba całkowita, powiedzmy n (1 <= n < b)
. Przez pierwsze numery n
na liście musimy ustalić, ile liczb jest mniejszych niż, powiedzmy m
((). Można tego dokonać metodą brutalnej siły, dając w ten sposób O(n)
.
Przykład:
a=6, b=13, n=8, m=6
lista jest:
6, 12, 5, 11, 4, 10, 3, 9, 2, 8, 1, 7
to permutacji o numerach od 1 do 12, ponieważ operacja modulo z dwoma współpracowników bodźce wytwarza permutacja liczb, jeśli dołączymy inny numer, czyli 0
. Jeśli weźmiemy a= 2, b=13
, wtedy lista byłaby 2, 4, 6, 8, 10, 12, 1, 3, 5, 7, 9, 11
, która daje wzór. Natomiast jeśli a
i b
są bardzo duże (w moim projekcie mogą one wzrosnąć nawet do 10^20), to nie mam pojęcia, jak wydedukować wzorzec o tak dużej liczbie.
Teraz wracając do przykładu, bierzemy pierwsze n = 8
numerów z listy, co daje
6, 12, 5, 11, 4, 10, 3, 9
Zastosowanie operatora less-than
z m = 6
, daje łączną liczbę numerów mniej niż m
samopoczucia 3, jak wyjaśniono poniżej w wykazie
0, 0, 1, 0, 1, 0, 1, 0
gdzie 0 oznacza nie mniejszy niż m
, a 1 oznacza mniej niż m
.
Ponieważ algorytm powyżej jest O(n)
, który jest nie do zaakceptowania dla zakresu [0, 10^20]
, dzięki czemu społeczność dać wskazówkę/clue/końcówki, aby umożliwić mi się osiągnąć O(log n)
rozwiązanie, albo jeszcze lepiej O(1)
rozwiązanie?