program odmocnina; const MAX=100; var permutace:array[1..MAX] of integer; cykly:array[1..MAX] of integer; N:integer; procedure nacti; { Načte vstupní permutaci } var i:integer; begin readln(N); for i:=1 to N do read(permutace[i]); end; procedure urci_cykly; { Určí počty cyklů jednotlivých délek} var oznac:array[1..MAX] of boolean; var i,j,k:integer; begin for i:=1 to N do begin oznac[i]:=true; cykly[i]:=0; end; for i:=1 to N do if oznac[i] then begin j:=i; k:=0; while oznac[j] do begin oznac[j]:=false; j:=permutace[j]; inc(k) end; inc(cykly[k]) end; end; function mu(delka:integer; pocet:integer):longint; { Spočítá z kolika konfiguraci lze vytvorit _pocet_ cyklů délky _delka_ } begin if (delka mod 2=0) then case pocet of 0: mu:=1; 1: mu:=0; 2: mu:=delka; else mu:=delka*(pocet-1)*mu(delka,pocet-2); end else case pocet of 0: mu:=1; 1: mu:=1; 2: mu:=delka+1; else mu:=mu(delka,pocet-1)+delka*(pocet-1)*mu(delka,pocet-2); end end; function pocet:longint; { Určí počet odmocnin zadané permutace } var i:integer; K:longint; begin K:=1; for i:=1 to N do K:=K*mu(i,cykly[i]); pocet:=K end; begin nacti; urci_cykly; writeln(pocet); end.