program robot; var sito : array [ 1..1000000 ] of longint; N, K, M : longint; i, j : longint; vysledek : longint; {rozklad[i] odpovídá největšímu exponentu z takovému, že i^z dělí (N nad K).} rozklad : array [ 1..1000000 ] of longint; mocnina : longint; begin readln(N,K,M); for i:=2 to N do begin sito[i]:=0; rozklad[i]:=0; end; {Jednoduché zrychlení.} if K > N-K then K:=N-K; {Eratostenovo síto, které navíc počítá největší prvočíslo dělící každé složené číslo.} for i:=2 to N do begin if sito[i]=0 then begin j:=i*2; while j<=N do begin sito[j]:=i; j:=j+i; end; end; end; {Kombinačnííslo je součin čísel od N-K+1 do N ...} for i:=N-K+1 to N do inc(rozklad[i]); {...dělen k! } for i:=2 to K do dec(rozklad[i]); vysledek:=1; for i:=N downto 2 do begin if sito[i]=0 then begin mocnina:=i mod M; while rozklad[i]<>0 do begin {Nejvyšší číslo rozkladu je prvočíslo,} {zpracujeme je. Rozložíme exponent na součet mocnin dvojky a ty spočítáme prostým mocněním modulo M.} if rozklad[i] mod 2 = 1 then vysledek:=(vysledek*mocnina) mod M; {Zkus vyššíninu.} mocnina:=(mocnina*mocnina) mod M; rozklad[i]:=rozklad[i] div 2; end; end else begin {Nejvyšší číslo rozkladu je číslo složené.} rozklad[sito[i]]:=rozklad[sito[i]]+rozklad[i]; rozklad[i div sito[i]]:=rozklad[i div sito[i]] +rozklad[i]; end; end; writeln(vysledek); end.