Grzegorz Jakacki (treść)    Krzysztof Sobusiak (opracowanie, program wzorcowy)

Automorfizmy

Turniejem nazywamy graf skierowany, w którym:

Oznaczmy przez p dowolną permutację zbioru wierzchołków turnieju. (Permutacją skończonego zbioru X nazywamy każdą różnowartościową funkcję z X w X.) Permutację p nazywamy automorfizmem, jeżeli dla dowolnych dwóch różnych wierzchołków u i v zwrot krawędzi pomiędzy u i v jest taki sam, jak pomiędzy p(u) i p(v) (tzn. u rightarrow v jest krawędzią w turnieju wtedy i tylko wtedy, gdy p(u) rightarrow p(v) jest krawędzią w tym turnieju). Dla zadanej permutacji p interesuje nas, dla ilu turniejów jest ona automorfizmem.

Przykład

Weźmy zbiór wierzchołków oznaczonych liczbami 1,...,4 oraz permutację p:

     p(1) = 2qquad p(2) = 4qqu...

Istnieją tylko cztery turnieje, dla których ta permutacja jest automorfizmem:

     epsffileaut.1qquad     ...

Zadanie

Napisz program, który:

Wejście

W pierwszym wierszu pliku tekstowego AUT.IN znajduje się jedna liczba naturalna n, 1leq nleq 10,000, będąca liczbą wierzchołków.

W kolejnych n wierszach znajduje się opis permutacji p. Zakładamy, że wierzchołki są ponumerowane liczbami od 1 do n. W wierszu (k+1)-szym znajduje się wartość permutacji p dla wierzchołka nr k (tzn. wartość p(k)).

Wyjście

W pierwszym i jedynym wierszu pliku tekstowego AUT.OUT powinna znaleźć się jedna liczba całkowita będąca resztą z dzielenia przez 1 000 liczby różnych n-wierzchołkowych turniejów, dla których permutacja p jest automorfizmem.

Przykład

Dla pliku wejściowego AUT.IN
4
2
4
3
1
poprawną odpowiedzią jest plik wyjściowy AUT.OUT
4

Rozwiązanie

phCyklem permutacji p będziemy nazywać k-elementowy ciąg różnych liczb (c_0, c_1, dots, c_k-1) taki, że c_i = p(c_i-1), dla 1 le i < k i c_0 = p(c_k-1). Łatwo pokazać, że każdą permutację można przedstawić w postaci zbioru rozłącznych cykli.

Dla przykładu permutacja p:

p(1)=2 qquad p(2)=5 qquad p(3)...

składa się z dwóch cykli:

epsffileaut2.1qquadepsffile...

Liczbę s gromad wyznaczonych przez daną permutację p można szybko znaleźć, znając rozbicie permutacji na cykle.

Weźmy cykl C o długości k oraz należące do niego elementy u i v. Połóżmy biały żeton na u i czerwony żeton na v. Jeśli oba żetony jednocześnie przesuniemy po cyklu o jeden element, to dostaniemy parę zależną od u, v. Aby wyznaczyć wszystkie takie pary powtarzamy ten ruch tak długo, aż oba żetony z powrotem znajdą się na pozycjach startowych u i v.

Zauważmy, że jeśli długość cyklu k jest liczbą parzystą i v jest odległe o kover 2 od u na cyklu C, to po k/2 krokach czerwony żeton znajdzie się na u, a biały - na v. To oznacza sprzeczność - u rightarrow v jest krawędzią w turnieju wtedy i tylko wtedy, gdy v rightarrow u jest krawędzią w tym turnieju. W takim przypadku nie istnieje żaden turniej, dla którego permutacja p byłaby automorfizmem - ostateczną odpowiedzią jest liczba 0. Dalej będziemy zakładać, że wszystkie cykle są nieparzystej długości.

Jeśli długość cyklu jest liczbą nieparzystą, to niezależnie od tego jak wybraliśmy u i v, do początkowego ustawienia żetonów powrócimy po k krokach. Liczba k jest zatem licznością dowolnej gromady złożonej z par elementów cyklu C. Zbiór różnych par elementów cyklu C ma k(k-1)/2 elementów, zatem rozpada się na (k-1)/2 gromad.

Niech teraz u będzie elementem cyklu C o długości k, a v - elementem cyklu D długości l. Połóżmy znowu biały żeton na u, a czerwony na v. Aby wyznaczyć pary zależne od u, v, podobnie jak poprzednio synchronicznie przesuwamy żetony, tym razem po rozłącznych cyklach. Po ilu krokach wrócimy do sytuacji początkowej? Żeton biały wraca na u po k krokach, żeton czerwony wraca na v po l krokach, zatem musimy wykonać NWW(k, l) kroków. Wszystkich par o jednym elemencie z C i drugim z D jest kl, a wszystkie gromady utworzone z takich par są liczności NWW(k, l), więc mamy kl/NWW(k, l) = NWD(k, l) takich gromad.

Możemy już policzyć liczbę gromad, na które rozpada się zbiór wszystkich par. Musimy najpierw wyznaczyć długości wszystkich cykli permutacji p - tę operację można łatwo zaimplementować, by działała w czasie O(n) - a następnie posumować liczby gromad po wszystkich parach cykli, stosując wyżej wyprowadzone wzory. Ponieważ permutacja może mieć rzędu n cykli, nasz algorytm miałby złożoność czasową nie lepszą niż O(n^2). Możemy jednak poprawić ten wynik poprzez zbiorowe traktowanie cykli o identycznych długościach. Niech ck oznacza liczbę cykli o długości k. Wtedy sumaryczna liczba gromad utworzonych przez pary o elementach pochodzących

Ile może być różnych długości cykli? Aby było ich najwięcej, musimy wziąć po jednym cyklu o długości 1, 3, 5, ..., przy czym suma długości cykli nie może być większa od n. Ponieważ 1+3+5+dots+lceil 2 sqrt n rcei..., różnych długości cykli jest co najwyżej O(sqrt n). Do rozpatrzenia mamy zatem O(n) par grup cykli różnych długości. Policzenie NWD(p, q) algorytmem Euklidesa zajmuje czas O(log p + log q) czasu (jego opis Czytelnik znajdzie w [13]), zatem otrzymujemy algorytm o złożoności czasowej O(n log n).

To nie koniec zadania, gdyż pozostaje nam jeszcze policzyć resztę z dzielenia t = 2^s przez 1000. Kolejne potęgi dwójki będziemy naliczać iteracyjnie. Łatwo zauważyć, że przy wykonywaniu kolejnych mnożeń przez 2 wystarczy przechowywać jedynie resztę z dzielenia aktualnego wyniku przez 1000. Obserwacja ta jednak nie wystarcza, ponieważ s może być rzędu n2. Zauważmy jednak, że po wystarczająco dużej liczbie kroków (ale na pewno mniejszej niż 1000) trafimy w końcu na wartość, którą otrzymaliśmy już wcześniej. Niech i będzie właśnie takim najmniejszym wykładnikiem, że 2^i mod 1000 = 2^m mod 1000 dla pewnego m < i. Wtedy dla każdego j > i mamy

2^j mod 1000 = (2^i mod 10...

Wystarczy zatem namnożyć dwójkę jeszcze (j-i) mod (i-m) razy. Aby zrealizować ten algorytm potrzebna nam będzie 1000-elementowa tablica, w której r-tym elementem będzie wykładnik i, dla którego otrzymaliśmy resztę r.

Algorytm ten wykona co najwyżej 2000 mnożeń, więc jego złożoność czasowa to O(1) (jest stała)!

Testy

Do sprawdzania rozwiązań zawodników użyto 12 testów. Testy 2 i 3 oraz 11 i 12 były zgrupowane. Permutacje z wszystkich testów, za wyjątkiem testu 2, zawierały wyłącznie cykle nieparzystych długości. Krótki opis testów zawarty jest poniżej:

  • AUT1.IN - prosty test poprawnościowy,
  • AUT2.IN - prosty test poprawnościowy z cyklem parzystej długości,
  • AUT3.IN - prosty test do zgrupowania z 2,
  • AUT4.IN - poprawnościowy test losowy, permutacja 50-elementowa o 4 cyklach,
  • AUT5.IN - test poprawnościowy, permutacja 501-elementowa o jednym cyklu,
  • AUT6.IN - wydajnościowy test losowy, permutacja 10000-elementowa o 100 cyklach,
  • AUT7.IN - wydajnościowy test losowy, permutacja o 100 cyklach długości 1, 3, 5, ..., 199,
  • AUT8.IN - wydajnościowy test losowy, permutacja 5000-elementowa o 4500 cyklach,
  • AUT9.IN - wydajnościowy test losowy, permutacja 10000-elementowa o 5000 cyklach,
  • AUT10.IN - wydajnościowy test losowy, permutacja 10000-elementowa o 8000 cyklach,
  • AUT11.IN - 10000-elementowa permutacja identycznościowa,
  • AUT12.IN - prosty test do zgrupowania z 11.