降順大法1
質問表面:
、B、P、^ Bの%のP、0 <A <= 10 ^ 9,0 <B <= 10 ^ 10000,0 <p <= 10 ^ 9の計算結果を与え。
アイデア:
10の10000パワーは、この質問は簡単ではありません。だから、次のような結論をオイラーの定理を学習後:、nは互いに素が、それは彼がこの質問を解決するために使用することができないことは明らかです。だから、オイラーの定理の拡張がされて入ってきました。
C ≡ A 、C 、M 、O 、D φ (M )+ φ (M )(M またはD M )
ここで、C> = [ピー] (M )。彼は、彼らガードポイントに強い、非常に強いです。この定理のために、私は、エレガントな証拠を持っていますが、インターネット上で再生するために出てきません。さらに、C <[ピー] (M )場合、電力を直接かつ迅速。
戻るこの質問に、この質問は、より多くの、それは非常に後でpは嫌だが、それを解決するために、拡張オイラーの定理を使用するよりも何もありません。
すべてのものは、φに対処するために、最初の読み取りに来る(p型)、および、インデックスプロセスは、高速読み取りに似ています。しばらく、φ%高速な読み取りのためにのみ加算と乗算を必要とする、再びカウントすることができます(p型)。
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <fstreamの> 使用して 名前空間をSTD。 #define LL長い長いです 、B、P、MODをちゃいます。 チャー S [ 100005 ]。 LL PHI(INT N){ LL ANS = N。 以下のために(INT iが= 2 ; iが* I <= N; ++ I){ 場合(N%I == 0 ){ ANS = ANS /私は(I-* 1 )。 一方、(N%I == 0)N / = I。 } } もし(N> 1)年=年/ N *(N- 1 ); リターン歳; } 長い 長いKSM(-1,11,11- b)は{ LL SP = 1 。 一方、(b)は、{ もし、(B&1)SP * = 。 SP%= P。 B >> = 1 。= * ;%= P。 } リターンSP; } int型のmain(){ // freopenは( "R"、STDIN "です。"); // freopenは(、 "W"、stdoutを"アウト。"); scanf関数(" %LLD%S%LLD "、および、S&P)。 INT LEN = STRLEN(S)。 MOD = PHI(P)。 INTフラグ= 0 。 以下のために(INT iが= 0 ; I <LEN; ++ I){ B = B * 10 +(S [I] - ' 0 ' )。 もし(B> = MOD)フラグ= 1 。 B%= MOD。 } もし(フラグ)B + = MOD。 COUT << KSM(A、B)%のP << ENDL。 リターン 0 ; }
降順大法2
質問表面:
アイデア:
禁止は彼女を設定します!!はい、ときに私は省略記号直接無意味を参照してください。あなたはこの問題を呼び出しますか?明らかにマトリョーシカです。
しかし、彼はいない無制限の入れ子人形(世界崩壊)で、答えがありますが、ネスティング人形です。マトリョーシカはセットは彼女に、この問題の鍵嘘最小がなければならないことを知ってみるの入れ子人形の最小を見つけます。
拡張オイラーの定理によって、私たちは、フィルムの数別の番号が、この作業は、トレーニングと彼のインデックスの作成することができることを知ることができます。トレーニングとインデックスとそのインデックスの準備の入れ子人形です。関数シリング= 2 Tに設計され、私たちはそう2 ... φまでの彼のタスクは、問題のT%pを、その無限再帰プロセスを解決することであり、そしてpは常にPHIで、ファイ、ファイ、ファイ...を(P- )= 1、終わりに数%1 = 0は、人形をネストことは明らかです。最小の赤ちゃんFOUND
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <fstreamの> 使用して 名前空間をSTD。 #define LL長い長いです 、B、Pをいただけれ。 チャー S [ 100005 ]。 LL PHI(INT N){ LL ANS = N。 以下のために(INT iが= 2 ; iが* I <= N; ++ I){ 場合(N%I == 0 ){ ANS = ANS /私は(I-* 1 )。 一方、(N%I == 0)N / = I。 } } もし(N> 1)年=年/ N *(N- 1 ); リターン歳; } 長い 長いKSM(-1,11,11-のB、LL MOD){ LL SP = 1 。 一方、(b)は、{ もし、(B&1)SP * = 。 SP%= MOD。 B >> = 1 。= * ; A%= MOD。 } リターンSP; } INT解く(int型P){ int型 K = PHI(P)。 もし(K == 1)戻り 0 ; リターン KSM(2、((K)+解決K)、P)。 } int型のmain(){ しばらく(scanf関数(" %のLLD "、&P)!= EOF){ COUT <<(P)を解く<< ENDL。 } リターン 0 ; }