質問の意味:
$ 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 。 }