それは、感じがすることができ、実装BSGSの午後十分な理解をしたという事実に、前に一生懸命考えていませんでした。。。
それは何であるBSGS? - 高次合同方程式を解くことができます。明確かつ簡潔。
勉強したい場合は、お勧めのブログの首長を話す、まだ非常に明確です。
この質問は私たちのためです。。。。。
我々は観察して見ることができ 、我々は9つの側面に加えて、Aとオリジナルの式を掛けることができ剰余の性質を
これは、ようBSGSは、標準式を発見しているメートルの保証が素数であるので、使用BSGSを拡大する必要はありません。
その質問のヘッドはLLを爆破しようとしている私たちを見つけます
大物は迅速に乗って、ラララを学ばなければならなかった、_int128を書きます
クイックコードを取ります:
LL MUL(LL、LLのB、P LL) { LLのL = *(B >> 25LL)%のP×(1LL << 25)%のP。 LL Rは *(B&((1LL << = 25) - 1))%のPと、 リターン(L + R)%のP。 }
この場合、この質問はA、そして幸せになることができます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define LL長い長 LLのK、P。 LL MUL(LL、LLのB、P LL) { LLのL = *(B >> 25LL)%のP×(1LL << 25)%のP。 LL Rは *(B&((1LL << = 25) - 1))%のPと、 リターン(L + R)%のP。 } LLのKSM(LLのX、LL Y) { LL用のRES = 1 。 用(; Y、Y >> = 1、X = 1LL * MUL(X、X、P)) であれば(Y&1)RES = 1LL * MUL(RES、X、P)。 リターン解像度; } マップ <LL、LL> 融点; INT メイン() { scanf関数(" %のLLDの%のLLD "、&K&P)。 K = 9 * K + 1、K%= P。 LL M = CEIL(SQRT(P)); LL今= K。 用(LL i = 0 ; I <= M Iは++ ) { MP [今] = I + 1 。 今(今、MUL = 10 、P)を、 } 今 = 1 ; LL ANS = - 1 ; LL KK = KSM(10 、M)。 用(LL I = 1 ; I <= M; iは++ ) { 今 = 1LL * MUL(今、KK、P)。 場合 {ANS =([今] MP)iがM-MPを[今] + * 1。ブレーク;} } のprintf(" %のLLD " 、ANS)。 リターン 0 ; }