数論の寄せ集めでは、塗りつぶしに代わってピットを残して、最初のコードを配置しました:
/ * ************************************************ ************* 問題:1951 ユーザー:JBLee 言語:C ++ 結果:受理 時間:152ミリ秒の メモリー:2856キロバイト ***************** ********************************************** * / の#include <ビット/ STDC ++ H> に#define INT長い長い 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 7 。 const int型のmod = 999911658 ; int型N、G。 int型の合計。 int型の M [ 5 ] = { 0、2、3、4679、35617 }。 INT JC [MAXN]。 INT X、Y。 INT 中国[MAXN]。 INT KSM(int型のx、int型のn、int型のMO){ int型の ベース = 1 。 一方、(N){ 場合(N - 1)基地 = ベース * X%のMO。 X = X * X%のMO; N >> = 1 。 } 戻り 塩基; } INT exgcd(INT A、INT&X、int型 B、INT&Y){ 場合(!{b)は 、X = 1 ; Yは= 0 ; 返します。 } int型 GCD = exgcd(B、X%のB、Y)。 INTの TMP = X; X = Y; Y = tmp-(/ B)* Y。 リターンGCD。 } INT INV(INT A、INTのMO){ exgcd(X、MO、Y)。 リターン(のx%のMO + MO)%のMO。 } のボイドの仕事(int型 P){ JC [ 0 ] = 1、JCは、[ 1 ] = 1 。 用(int型 iは= 2 JC [I] = JC [1-; I <= P iが++)1 ] * I%のP。 } int型櫛(整数 nは、整数 M、INT P){ 場合(M> N)戻り 0 ; 戻り JC [N] * INV(JC [nm]で、P)%のP *はINV(JC [m]を、P)%のP。 } INTルーカス(整数 nは、整数 M、INT P){ 場合(!m)のリターン 1 。 他 戻り櫛(N%のP、Mの%のP、P)*ルーカス(N / P、M / P、P)%のP。 } INT(解決INT P){ 作業(p)を。 int型 ANS = 0 ; 以下のために(int型 i = 1 ; iは++; iは<= N * {) であれば(N%I == 0 ){ ANS =(ANS +ルーカス(N、I、P))%のP。 もし(!N / I = I)ANS =(ANS +ルーカス(N、N / I、P))%のP。 } } 戻りANS。 } int型china_mod(){ 用(INT I = 1;私は= < 4 ; iは++)中国[I] = 解く(M [I])。 INT LCM = 1、ANS = 0 、MI。 以下のために(int型 i = 1 ; iは= < 4 ; I ++)LCM * = Mを[I]。 以下のために(int型 i = 1 ; iが<= 4 ; I ++ ){ MI = LCM / M [i]は、 exgcd(MI、X、M [i]は、Y)。 ANS =((ANS + MI * X *中国[I])%のLCM + LCM)%のLCM。 } 戻りANS。 } メイン署名された(){ scanf関数(" %のLLDの%のLLD "、&N、&G)。 もし(グラム%(MOD + 1)== 0 ){ のprintf(" 0 \ n " ); リターン 0 ; } のprintf(" %LLDする\ n "、KSM(G、china_mod()、MOD + 1 ))。 リターン 0 ; }