Wojciech Rytter | Marcin Stefaniak |
Treść zadania, Opracowanie | Program wzorcowy |
Oznaczmy przez liczbę dzielników liczby i (włącznie z 1 i i). Dodatnią liczbę całkowitą nazywamy antypierwszą, gdy ma ona więcej dzielników niż wszystkie dodatnie liczby całkowite mniejsze od niej. Przykładowymi liczbami antypierwszymi są liczby: 1, 2, 4, 6, 12 i 24.
Napisz program, który:
W jedynym wierszu pliku tekstowego ant.in znajduje się jedna liczba całkowita n, .
W jedynym wierszu pliku ant.out Twój program powinien zapisać dokładnie jedną liczbę całkowitą - największą liczbę antypierwszą nie przekraczającą n.
1000poprawną odpowiedzią jest plik wyjściowy ant.out
840
Efektywne rozwiązanie zadania opiera się na prostych własnościach liczb antypierwszych:
Widać, że liczba dzielników danej liczby nie zależy od wielkości liczb pierwszych występujących w jej rozkładzie na czynniki pierwsze, a jedynie od krotności, z jaką do tego rozkładu wchodzą.
Przykład
Przykładowymi liczbami antypierwszymi są liczby 1, 2, 4, 6, 12, 24 oraz duże liczby:
Przyjmijmy, że przez pi rozumiemy i-tą kolejną liczbę pierwszą, a przez ai rozumiemy krotność pi w rozkładzie n na czynniki pierwsze (możliwe, że ai = 0).
Jeżeli ciąg liczb ai nie jest nierosnący, to n nie może być liczbą antypierwszą, gdyż wtedy moglibyśmy tak zamienić miejscami pewne krotności, że otrzymalibyśmy mniejszą liczbę o tej samej liczbie dzielników. Dlatego możemy ograniczyć poszukiwania liczb antypierwszych do liczb o ,,nierosnących'' rozkładach na czynniki pierwsze. Łatwo możemy wygenerować wszystkie takie rozkłady dla liczb nie przekraczających danego ograniczenia górnego (kolejne rozkłady wyznaczamy w porządku leksykograficznym).
Jak się okazuje, liczb antypierwszych jest niedużo, dokładnie 68. Pierwsze 41 liczb antypierwszych przedstawiono w poniższej tabeli, razem z potęgami w rozkładach na kolejne liczby pierwsze.
Niech p1, p2, ..., pt będzie najdłuższym ciągiem kolejnych liczb pierwszych takich, że ich iloczyn nie przekracza n. Liczymy najpierw t. Istotnym jest to, że t jest stosunkowo małe, zatem liczba liczb pierwszych i ciągów do rozważenia nie jest bardzo duża. Aby znaleźć największą liczbę antypierwszą mniejszą lub równą n, rozważmy (najlepiej w kolejności leksykograficznej) wszystkie ciągi i1, i2, ... it spełniające dwa poniższe warunki.
Obserwacja
Przyjrzyjmy się strukturze pierwszych 40 liczb antypierwszych. W tabeli pokazane są wszystkie liczby antypierwsze mniejsze od 3 milionów. Zauważmy, że ostatnie potęgi, poza dwoma przypadkami, są równe 1. Przedostatnie potęgi są też nieduże. Nie jest to przypadek, ponieważ zachodzi poniższy fakt (dosyć trudny do uzasadnienia, ale prawdziwy). Korzystając z tego można ograniczyć przestrzeń rozpatrywanych danych.
Fakt
Dla każdej liczby antypierwszej, oprócz liczb 2 i 36, ostatnia potęga w rozkładzie na liczby pierwsze jest równa 1, natomiast potęgi druga i trzecia od końca nie przekraczają nigdy 4.
Zauważmy olbrzymią różnicę w liczbie liczb antypierwszych mniejszych od zadanej liczby n (dostatecznie dużej) w porównaniu z liczbą liczb pierwszych. Właśnie dzięki temu testowanie liczb antypierwszych jest znacznie łatwiejsze od testowania liczb pierwszych.
Zadanie testowane było na zestawie 21 danych testowych.