問題の意味:考えると、P = 1E9 + 7、A、 B. (X + Y)%P =満たし、X、Yのペアを見つける ; A 及び(X * Y)%P = Bと、
アイデア:つまり、X ^ 2-BX +CΞ0 ; 次いで、X = [B + -sqrt(B ^ 2-4C)] / 2。
全ての部分は、二次に、残りの要件を、従ってX ^ 2%、P = B ^ 2-4C Xを満たすために、MODPセンスで有します。
私たちは、テンプレートを設定します。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MOD = 1E9 + 7 。 typedefの長い 長いLL。 int型のk; LL、P、W。 構造体T {LLのX、Y;}; Tのmul_two(T AとT Bと、LLのP) { T ANS。 ans.x =(%のP W%のP *でAX * BX%以下のP +のAY *)%のP。 ans.y =%の(%Pが+のAYの* BX%のPによってAX *)P。 戻るANSを。 } Tのqpow_two(T、LL N、LLのP) { T ANS。ans.x = 1。ans.y = 0 ; 一方、{(N) であれば(N・1)ANS = mul_two(ANS、P)。 N >> = 1 。= mul_two(、P)。 } 戻りANS。 } LL qpow(LL N、LLのP LL) { LL ANS = 1。%= P。 一方、(N){ 場合(N - 1)ANS = ANS *%のP。 N >> = 1 ; = *%のP。 } 戻り ANS%のPと、 } LLルジャンドル(-1,11,11-のP) { 戻り qpow((P- 1)>>1 、P); } INT 解く(LL N、LLのP) { N%= P。もし(P == 2)リターン 1 。 もし(ルジャンドル(N、P)+ 1 == P)リターン - 1 。 それ以外の 場合(nは== 0)の戻り 0 ; LLのA = 1 。 一方、(ルジャンドル((*-N + P)%のP、P)+ 1 = P!)A =ランド()%のP。 T TMP; tmp.x = A; tmp.y = 1。(*-N + P)%のP = W。// W T ANS = qpow_two(TMP、(p +型1)>> 1 、P)。 返すans.x; } int型のmain() { scanf関数(" %のD "、&K); LL REV2 = 500000004 ; 一方、(k-- ){ LLのB、C。 scanf関数(" %のLLDの%のLLD "、&B、&C)。 LL T =((B * BC * 4)%MOD + MOD)%のMOD。 LLのD = (T、MOD)を解きます。 もし(Dの== - 1 ){ のprintf(" -1 -1の\ n " ); 続け; } LL X =(B + D)* REV2%のMOD、Y =(B-X + MOD)%MOD。 もし(X> Y)スワップ(X、Y) printf(" %LLD%LLD \ n " 、x、y)は、 } 戻り 0 。 }