여러 공식의 조합 :
일반 기간 :
$ C (N, M) = N! / (m * (㎚)!) $
재귀 :
$ C (N, M) = C (N-1, m-1) + C (N-1, m) $
루카스 정리 :
페이지에 적용하는 것은 소수 및 P 이하
$ 루카스 (N, M) = 루카스 (N / P, m / P) * C (n은 $ $ 개조 $ $ P, m $ $ 개조 $ $ P) $ $ (MOD $ $ P) $
루카스 $ (N, 0) = 1 $
다음 코드는
CONST INT maxn 1E5 + = 10 ; INT의 t, N, M, P; 긴 긴 물질 F maxn]; 보이드 get_fac () { F는 [ 0 ] = 1 ; 위한 ( INT 난 = 1 ; I <P = I ++ ) F [I] = (F [I- 1 ] * i)는 %의 P를; } INT qpow ( INT A, INT의 b) { 긴 긴 ANS = 1 , 베이스 = a 및 반면 (b) { 경우 (B &1 ) = ANS (ANS * 기재 ) %의 P; 염기 = ( 베이스 * 기재 ) %의 P; B >> = 1 ; } 반환 ANS; } INT INV ( INT X) { 복귀 qpow (X, P- 2 ); } INT C ( INT N, INT의 m) { 경우 (m> n)의 복귀 0 ; 리턴 F [N] * INV (F [m]) %의 P * INV (F [나노]) %의 P; } INT의 루카스 ( INTN, INT의 m) { 경우 (m == 0 ) 돌려 1 ; 창 ( 긴 길이 ) 루카스 (N / P, m / P) * C (N %의 P, m의 %의 P) %의 P; } INT 의 main () { 는 scanf ( " %의 D " , t); 반면 (t-- ) { 는 scanf ( " % D % D % D " , 및 N, M, P); get_fac (); 의 printf ( " 가 % d \ n " , 루카스 (N + m, m)); } 반환 0 ; }