以上の2019頭の牛オフサマースクールキャンプを(第九のフィールド)B:二次方程式(連立一次方程式のmod感の下で平方剰余の要件)

問題の意味:考えると、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 = 1ans.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 
}

 

おすすめ

転載: www.cnblogs.com/hua-dong/p/11361215.html