조합 수 / 루카스 정리

여러 공식의 조합 :

일반 기간 :

$ 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 ; 
}

 

추천

출처www.cnblogs.com/mogeko/p/11809572.html