B.Quadratic equation(二次剩余)
•题意
给你 b,c 值,求解 x,y 使得其满足,其中 p=109+7:
1.$0\leq x\leq y <p$
2.$x+y\equiv b\ (mod\ p)$
3.$xy\equiv c\ (mod\ p)$
•题解
易得 $(x-y)^{2} \equiv (x+y)^{2}-4xy \ (mod\ p)_{\cdots\cdots\cdots} (1)$;
将条件 1,2 带入上式得:
$(x-y)^{2} \equiv b^{2}-4c \ (mod\ p)_{\cdots\cdots\cdots} (2)$;
首先,判断 (2) 式是否由解,即判断 $b^{2}-4c$ 是否为模 p 得二次剩余;
令 $d=b^{2}-4c$;
①$d^{\frac{p-1}{2}}\equiv 1 \ (mod\ p)$:
那么,易得 $(x-y)^{2} \equiv d^{\frac{p+1}{2}}\ (mod\ p)_{\cdots\cdots\cdots} (3)$;($d \equiv d\cdot d^{\frac{p-1}{2}}\ (mod\ p)$)
同余式两端同时开方得:$(x-y) \equiv d^{\frac{p+1}{4}}\ (mod\ p)_{\cdots\cdots\cdots} (4)$;
并且,易得 (p+1)%4 == 0;
所以,$d^{\frac{p+1}{4}}$ 是 (4) 式得整数解;
由条件 2 和式 (4) 可得:
$2x \equiv b+d^{\frac{p+1}{4}}\ (mod\ p)_{\cdots\cdots\cdots} (5)$
又因为 GCD(2,p) = 1,所以,式(5)可化为:
$x \equiv (b+d^{\frac{p+1}{4}})\cdot inv_{2} \ (mod\ p)_{\cdots\cdots\cdots} (6)$;
通过式 (6) 顺利求出 x;
由条件 1 可得 x+y = b or b+p;
那么,y 也就求出来了;
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 ll p=1e9+7; 6 ll b,c; 7 8 ll qPow(ll a,ll b) 9 { 10 ll ans=1; 11 while(b) 12 { 13 if(b&1) 14 ans=ans*a%p; 15 a=a*a%p; 16 b >>= 1; 17 } 18 return ans; 19 } 20 void Solve() 21 { 22 ll d=b*b-4*c; 23 d=(d+p)%p;///保证d为正,不影响答案的正确性 24 25 if(d == 0)///特判d为0的情况 26 { 27 printf("%lld %lld\n",b/2,b/2); 28 return ; 29 } 30 if(qPow(d,(p-1)/2) != 1)///判断d是否为模p的二次剩余 31 { 32 puts("-1 -1"); 33 return ; 34 } 35 36 ll x=(b+qPow(d,(p+1)/4))%p*qPow(2,p-2)%p; 37 ll y=b-x; 38 y=(y+p)%p; 39 40 printf("%lld %lld\n",min(x,y),max(x,y)); 41 } 42 int main() 43 { 44 int T; 45 scanf("%d",&T); 46 while(T--) 47 { 48 scanf("%lld%lld",&b,&c); 49 Solve(); 50 } 51 return 0; 52 }