传送门

 

 

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

 1 #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 }
View Code

相关文章: