ルーカス定理テンプレートのフルノートを拡大

#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 = 1Y = 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 ; 
}

 

おすすめ

転載: www.cnblogs.com/gzr2018/p/11607182.html