#define _CRT_SECURE_NO_WARNINGS する#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // の#defineは長い長いっ typedefの長い 長いLL。 // 拓展GCD、求解= GCDによって斧+(a、b)は 空隙 ex_gcd(-1,11,11-のB、LL&X、LL&Y){ 場合(!{b)は 、X = 1。Y = 0 。 } 他{ ex_gcd(B、 %のB、Y、X)。 Y - = X *(A / B)。 } } // 求解关于のP的逆元、其中GCD(P)== 1 LL逆(LL pを、LL){ 場合(A!)戻り0LL。 LL X、Y。 ex_gcd(P、x、y)は、 X =(X%P + P)%のP。 リターンのx; } // 快速幂A ^ Bの (LLのB -1,11,11-のP)のLL qpow { LL RES = 1 。 一方、(b)は、{ もし、(B&1)RES =のRES *%のP。= A *%のP; B >> = 1 。 } 戻りRESと、 } // 中国剩余定理、求解X = [I]%のM [i]は方程组 LL CRT(INT N-、LL * A、LLの*のM){ LL Mは = 1、RES = 0 ; のための(int型 I = 0を I <N-; I ++)はM = Mの*のM [I]、 のために(int型私は= 0 ; I <N - 、I ++ ){ LLのX、Y、 LL(TM) = M / M [I]は、 ex_gcd((TM)、M [I]、X、Y); RES =(RESは、+(TM)* X * A [I]% M)%M; } リターン(RES + M)%M; } // Xは素数を表し、Pが爆発T ^ Xである // CalcのコンピューティングN!%P、Pは、必ずしも素数、Pの*ログ(X)(nは複雑ではありません ) CALC LL(N-LL、LLのX、P LL){ IF(N!)リターン 1 ; LL S = 1 ; // 線形時間に1の倍数ではない製品中P xを計算 // Pは素数ではないために、することができませんウィルソンの定理と // 最適化は、事前にテーブルを再生することができますセット、複数の場合は、それはPの合計があまりにも多く、非常に便利ではないと思われる ため(LL = I 2 ;私は= Pを<;私は++ ){ IF(%I X)= S %Iは、S * Pが; } S = qpow(S、N- / P、P); // 次のループの前部に数Pは // これは、不必要な計算、すなわち、残りのn%のP のための(LL = I 2、I <= N%P; I ++の) IF(X I%)= SのS * I%P。 戻り S *計算値(N / X、X、P)、%Pは; } // Xは素数を表し、PはX ^ T分解される // 計算C(n、m)が%P 、Pは素数の累乗である multilucas LL (N-LL、LLのMと、X LL、LL P){ LL CNT = 0 ; // それぞれ三の階乗複雑Xログを含むインデックス番号を以下 // 一方はN見つけることができれば、これは知りません!関連するプロパティの%のP のため(登録LL I = N-; I> 0 ; I / = X) CNT + = I / X; のための(LL I = M、I> 0 ; I / = X)CNT - = I / X; のための(I = N-LL - M、I> 0 ; I / = X)CNT - = I / X、 リターンqpow(X、CNT、P) %のPの*計算値(N、X、P)%のP *を逆(計算値(M、X、P)、P)%のP *を逆(計算値(N - M、X、P) 、P)%P; } // 溶液C(n、m)が%P最終回答 LLのex_lucas(N-LL、LLのM、LL P){ LL CNT = 0 ; // ストレージアレイC(n、m)は残りの各素因数分解後の結果を // 因子番目の各生殖質tは互いに素であるので、それはCRTで解決することができる // の各クラス素因数分解後のP配列格納された回答 LL P [ 20である ]、A [ 20である ]; // 20の最大素因数分解 のための(LL I = 2、I *はI <= P; I ++は){ // 予め素数テーブルを再生する最適化されてもよい点 IF(P%でI = = 0 ){ P [CNT] =1 ; 一方、(P%のI == 0){P [CNT] = P [CNT] * I。P / = I。} [CNT] = multilucas(N、M、I、P [CNT])。 CNT ++ ; } } // 最后是一个质数 であれば(P> 1)P [CNT] = P [CNT ++] =のmultilucas(N、M、P、P)。 戻りCRT(CNT、p)を、 } int型のmain() { LL N、M、P。 scanf関数(" %LLD%LLD%LLD "、&N、&M、&P)。 printf(" %LLDの\ nを"、ex_lucas(N、M、P))。 cinを >> N; リターン 0 ; }