元の質問へのリンク:
質問の意味:
\(既知の(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;
}