题意:给你b,c,p = 1e9 + 7,满足以下方程的x,y,如果没解输出 -1 -1
(x + y)mod p = b
(x * y)mod p = c
思路:已知x+y = b 或 x+y = b + p, xy = c + kp ;
则
通过二次剩余定理,求出(x-y)
x = (x-y)+(x+y) >> 1
y = x + y - x;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+7;
struct T{
long long p, d;
};
long long Ksm(long long a, long long b, long long p) {
long long res = 1;
while(b) {
if(b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
long long w;
//二次域乘法
T Mul_er(T a, T b, long long p) {
T ans;
ans.p = (a.p * b.p + a.d * b.d % p * w % p) % p;
ans.d = (a.p * b.d % p + a.d * b.p % p) % p;
return ans;
}
//二次域快速幂
T Ksm_er(T a, long long b, long long p) {
T ans;
ans.p = 1; ans.d = 0;
while(b) {
if(b & 1) ans = Mul_er(ans, a, p);
a = Mul_er(a, a, p);
b >>= 1;
}
return ans;
}
//求勒让德符号
long long Legendre(long long a, long long p) {
return Ksm(a, (p-1)>>1, p);
}
long long Recever(long long a, long long p) {
a %= p;
if(a < 0) a += p;
return a;
}
long long solve(long long n, long long p) {//求解 x^2=n(mod p) 的x的值
if(n % p == 0) return 0;
if(p == 2) return 1;
if(Legendre(n, p) + 1 == p) return -1;
long long a = -1, t;
while(1) {
a = rand() % p;
t = a * a - n;
w = Recever(t, p);
if(Legendre(w, p) + 1 == p) break;
}
T tmp;
tmp.p = a; tmp.d = 1;
T ans = Ksm_er(tmp, (p+1)>>1, p);
return ans.p;
}
int main()
{
int t;
cin>>t;
while(t--)
{
ll b,c;
cin>>b>>c;
ll x=solve(((b*b-4*c)+mod)%mod,mod);
if(x==-1)
{
cout<<"-1"<<" "<<"-1"<<endl;
}
else
{
x=(x+b)*Ksm(2,mod-2,mod)%mod;
ll y=(b-x+mod)%mod;
if(x>y)
swap(x,y);
cout<<x<<" "<<y<<endl;
}
}
return 0;
}