B二次方程式2019頭の牛オフより学校第フィールド(平方剰余)

元の質問へのリンク:
質問の意味

\(既知の(X + Y)\) \(P = B \) \((X * Y)\) \(P = C \)\(\スペース\)、yはxを求める。もし存在する出力\( - 1 \スペース-1 \)


アイデア

\(差分方程式(XY)^ 2 \二乗し) =を\((X + Y)^ 2 \) \( - \) (4 *(X + Y)\)\ = \((2-4C B ^ )\) \(のp \)
\(我々はX ^ 2 \当量のD(MOD平方剰余の存在を考えます \空間P)、(dはその後、平方剰余モジュロPである)のxyのために解決するために、 B、X、Yの\)を取得する(XY)と
\(ルジャンドル記号を計算するために、ここで使用さオイラーの基準:\)
\ pは差別平方剰余問題の例素数であるとき(ルジャンドル記号を算出することができるが、屋シンボル決意条件に匹敵するが、pは任意の奇数\)の任意の整数である
十億七pが素数である所定の対象種について\(ので、オイラーの基準で行う\)
\(オイラーの基準に従って次の場合^ \ FRAC {P-1を有するMOD \である } {2} \当量\ SPACE1 \)を残りの二乗空間Pのための \((MOD \空間P) 、\空間^ \ FRAC平方残基Aでない場合1-P {} {2} \当量\ -space。1(MOD \スペースP)\)
\(私たちは、フラッシュ電源によって(B ^ 2-4Cを決定しなければならない)^ \ FRAC {P-1 } {2 }決定されるスペースMOD-1(無溶液)、溶液及び最後にX、Yが得られるが\に等しい。\)


(最初の使用の値下げエディタBurongyia ...)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll  mod  = 1000000007; 
ll q_pow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1)res=res*a % mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main(){
    int T;
    cin >> T;
    while(T--){
        ll b,c;
        cin >> b >> c;
        ll delta = (b * b - 4 * c  + mod) % mod;
        if(q_pow (delta,(mod - 1) / 2) == mod - 1) { puts("-1 -1"); continue; }
        ll a = q_pow (delta,((mod + 1) / 2 + 1) / 2);
        ll x = ((b - a + mod) * q_pow(2, mod - 2)) % mod;
        ll y = (b + mod - x) % mod;
        printf("%lld %lld\n", min(x,y),max(x,y));
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/Tianwell/p/11366814.html