2019頭の牛オフ数論の多くの学校第三D BigInteger--の基礎を

質問の意味:

$ A(N)と$コンポーネント整数のみ一組の$ N- $番号を表し、それは、1 \当量jを\の当量のMは、(i、iは当量nを\ $ 1 \当量を満たすために求めて、プライムの$ P $を与えられます^ $(i、j)は$の対数のJ)\当量0(モッズ\ P)$。

分析:

$ 11 ... 11 = \ FRAC {10 ^ N-1} {9} \当量0(MOD \ P)$相当$ 10 ^ N \当量1(MOD \ 9P)$、$ pが\のNEQ 2へ$ 5は、$ GCD(10、9P)= 1 $ので、$ 10 ^ {\ PHI(9P)} \当量1(MOD \ 9P)$があります。私たちは、最小の数は、方程式$ dの$を満たすサイクルフェスティバルで、明らかに$ D見つける必要がある\ | \ \ PHI(9P)$、$ \ PHI(9P)の直接列挙$除数を確認することができます。

\私は^ jは$ |サイクルセクションの$ D $を見つけた後、私たちは$ $ d個の\を満たす(j、i)に対して$のどれだけを知っている必要があります。

$ D $のために素因数分解は、$ D = P_1 ^ {K_1} P_2 ^ {K_2} ... P_L ^ {K_L} $を行い、$ J $は$私は満足する必要がどのような条件$、一定の時間を考えられて?私は$ $ $ G = P_1 ^なければなりません{\左\ lceil \ FRAC {K_1} {J} \右\ rceil} P_2 ^ {\左\ lceil \ FRAC {K_2} {J} \右\ rceil} .. 。\ P_L ^ {\左\ lceil \ FRAC {K_L} {J} \右\ rceil}倍数は、$ \ FRAC {n}は{G}のように合計が正当$ I $を$ $。

$ J $ので、30の$ J =上記の当量30 $ \ $ K_I、その結果は$ 30と同じであるため、$ Jは$ 30 1〜列挙、$ G $をそれぞれ算出することができます。

場合は$ P = 2.5 $の時間は、明らかに答えはゼロです。

$ \ファイ(9P)$もオイラー関数を計算するの$ P \ 3 $ NEQ、P-プライム3に、オイラー関数の積、$ \に係るPHI(9P)= \ PHI(9) \ PHI(P)= 6(P-1)$。

急激な電源に(血まみれのレッスンああ、枯れた髪、たくさんのワシントン州)__int128を必要とし、長い長い破裂します

コード:

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

typedefの長い 長いLL。

LLのP、M、N。
マップ <-1,11,11-> ミリアンペア。

__int128 qpow(__ int128のA、__int128のB、__int128のP)
{ 
    __int128 RES = 1 一方、(b)は、
    { 
        もし、(B&1)RES =のRES *%のP。=(* A)%のP。  // * Aの会爆長い長い 
        B >> = 1 ; 
    } 
    戻りRESと、
} 

LL qpow2(-1,11,11- b)は

{ 
    LLのRES= 1 ;
    一方、(b)は、
    { 
        もし、(B&1)RES =の解像度* 
        A * = 
        B >> = 1 
    } 
    戻りRESと、
} 

// 约数枚举O(√N)
LL除数(LL N、LLのP)
{ 
    ベクトル <LL> RES。
    以下のために(LL i = 1 ; iが* I <= N; iは++ 
    { 
        場合(N%I == 0 
        { 
            // のprintf( "I:%LLDする\ n"、I)。
            もし(qpow(10、I、9 *のP)%(9 * P)== 1リターンI。
            もし(!I = N / I)res.push_back(N / I); 
        } 
    } 
    のための(LL I = res.size() - 1 ; I> = 0 ; i-- 
    { 
        // のprintf( "I:%LLDする\ n"、RES [I])。
         もし(qpow(10、RES [i]は、9 *のP)%(9 * P)== 1戻りRES [i]は、
    } 
    戻り 0 
} 

// 整数分解O(√N)
ボイド prime_factor(LL n)が
{ 
    のInt I = 2 ; I ++は、私は<= N * 
    { 
        一方(N-I%の== 0 
        {
             ++ ;ミリアンペア[I] 
            N- / = I; 
        } 
    } 
    IF(!= N- 1)MA [ N-] = 1 ;         // のみ√Nより大きい素因数まで
} 


// jは固定ケースログ 
LL OneJ(INT J)
{ 
    LL RES = 1をため(それはオートma.begin =(); IT! ma.end =(); IT ++ 
    { 
        RES* = qpow2((※)1次回、(LL)CEIL((※).second * 1.0 / J))。
    } 
    戻り N / RES。
} 


int型  のmain()
{ 
    int型のT。
    scanf関数(" %のD "、&T)。
    一方、(T-- 
    { 
        scanf関数(" %LLD%LLD%LLD "、&​​P、およびN、&M)。
        // int型FAI = euler_phi(9 * pを)。
        LL K;
        もし(Pの== 2 ||のp == 5 
        { 
            のprintf(" 0 \ nは" );
             続ける; 
        } 

        場合(P == 3 
        { 
            K =除数(18 、P); 
        } 
        そうでなければ   、K =除数(6 *(P- 1)、P);   // のprintf(" K:%LLD \ N "K); 

        もし(K == 0)のprintf(" 0 \ n " );
         
        {ma.clear(); 
            LL RES = 0 ; 
            prime_factor(K);   // のprintf(" K:%LLD \ 、N」、K)

            であれば(M <30 
            { 
                 ためint型 I = 1 ; I <= M; iは++)RES + = OneJ(I)。
            } 
            
            { 
                ためint型 i = 1 ; iは= < 29 ; I ++)RES + = OneJ(I)。
                INT TMP = OneJ(30 )。
                RES + = TMP×(M - 29 )。
            } 
            のprintf(" %LLDする\ n " 、RES)。
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/lfri/p/11258814.html