[템플릿] 루카스를 확장

스티커 코드 :

#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘>
 사용  스페이스 성병; 
타입 정의  LL; 
서식 <TYPENAME T> 
인라인 공극 리드 (T & X) 
{ 
    T를 F = 1 , C = 0 ;  CH = getchar가 ();
    동안 (CH2 < ' 0 ' || CH> ' 9 ' ) { 경우 (CH2 == ' - ' ) F = - 1 ; CH = getchar가 ()}
    동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) {C = C * 10 + CH- ' 0 ' , CH = getchar가 ()} 
    X = F *에서의 C; 
} 
줄게 N, m, P; 
LL의 fastpow (LL의 X, Y의 LL, LL MOD) 
{ 
    LL의 RET = 1 ;
    반면 (Y) 
    { 
        경우 (Y & 1 ) = RET RET % * X MOD; 
        X = X * X % MOD; Y = >> 1 ; 
    } 
    반환 RET를; 
} 
공극 exgcd (LL A, B를 LL, LL 및 X, LL 및 Y)
{ 
    경우 (! b)는 {X = 1 , Y는 = 0 ; 반환 } 
    exgcd (B, A % B를, 예를 X) = Y-A / B * X; 
} 
LL의 반전 (LL A, LL MOD) {LL의 X, Y, exgcd (a, MOD, X, Y);  (X MOD % + MOD) % MOD} 
LL의 P [ 60 ], PK [ 60 ], PNT, F [ 60 ] [ 1000050 ]; 
LL JC [ 1000050 ]의 jny [ 1000050 ];
무효화 INIT를 () 
{ 
    줄게 지금 = P;
    대해 (LL I = 2 ; 나는 지금 = <*; 내가 ++) 경우 (현재 %를 I == 0 )
    { 
        P [ ++ PNT] = 1, PK [PNT] = 1 ;
        반면 (지금 %의 I == 0 ) 지금 / = 1, PK [PNT] * = I; 
    } 
    경우 (현재! = 1 ) 
    { 
        P는 [ ++ PNT = 현재 PK [PNT = 이제; 
    } 
    경우 (PNT의 == 1 ) 
    { 
        JC [ 0 ] = 1 ;
         (LL I = 1 ; I ++는, 난을 P <) JC가 [I]를 JC [I- = 1 * I의 %의 P를; 
        jny [P - 1 ] =의 반전 (JC [P- 1 ], P);
        ...에 대한(LL 난 = P-  1; I, I -) jny [I- 1 ] = jny [I]는 *의 I %의 P;
        반환 ; 
    } 
     (LL I = 1 ; I <= PNT; 내가 ++ ) 
    { 
        F [I] [ 0 ] = 1 ;
         (LL의 J = 1 ; J <PK [I] J ++ )
             만약 (j의 % 포인트 [I]) F [I] [J] = F [I] [J - 1 ] * j 개의 %의 PK [I];
            다른 물질 F I]는 [j]가 F가 = [I] [J = 1 ]; 
    } 
} 
LL calp (LL의 X, LL의 P) {LL의 RET = 0 ;  (X / = P, X, X / P =) RET = X +; 반환 RET를} 
(, 난을 게요 X 것이다) 게요 CALC를 
{
    경우 (X!)  1 ;
    반환 fastpow ([I] [PK [I] - F 1 ], X / PK [I], PK [I]) * [I]를 [X % PK [내가] % PK [내가 * CALC F (X / P [I], I); 
} 
루카스 (LL의 X, Y의 LL) LL 
{ 
    경우 (X <Y) 복귀  0 ;
    경우 (X <P) 반환 JC [X] * jny [Y] % 포인트의 jny * [XY] %의 P;
    반환 루카스 (X / P, Y / P) * 루카스 (엑스 %의 P, Y의 %의 P) %의 P를; 
} 
LL eLucas (LL의 X, LL에서, Y는, 값 int i)를 
{ 
    LL의 K = calp (X, P [I]) - calp (Y, P [I]) - calp (X-의 Y, P [I]);
    반환fastpow (p [i]를, K, PK [I])
              * CALC (X, I) %PK [I]는
             * INV (CALC (Y, I), PK [I]) %의 PK [I]는
             * INV (CALC (XY, I), 약동학 [ I]) %의 약동학 [I]; 
} 
LL ExLucas (LL의 X, Y의 LL) 
{ 
    경우 (PNT의 == 1 ) 반환 루카스 (X, Y)를; 
    LL ANS = 0 ;
     (LL I = 1 ; I <= PNT; 내가 ++ ) 
        ANS = (ANS + eLucas (X, Y, I) * (P / PK [I]) % P는 *의 반전 (P / PK [I], 약동학 [ I])의 P %) %의 P;
    반환 ANS를; 
} 
INT 의 main () 
{ 
    (P) 판독 (m) 판독 (n)를 판독; 
    초기화 (); 
    의 printf (" % LLD \ 없음 ", ExLucas (N, m));
    반환  0 ; 
}
코드보기

 

추천

출처www.cnblogs.com/LiGuanlin1124/p/11128840.html