스티커 코드 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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 ; }