\((x+y)\equiv b\pmod p\)

\((x\times y)\equiv c\pmod p\)

由第一个式子可知:\(x+y=b~or~x+y=b+p\)

先任选一个代入到第二个式子里得

\[(x\times(b-x))\equiv c\pmod p
\Rightarrow (2*x-b)^2\equiv (b^2-4c)\pmod p
\]

解二次剩余方程 \(q^2\equiv a\pmod p\)

因为这个方程去查了很多资料

1. 欧拉准则

对于\(x^2\equiv a\pmod p\)

\[a^{p-1\over 2} =
\begin{cases}
1\pmod p & {如果存在一个x使得a \equiv x^2 \pmod p}\\
-1\pmod p & {如果不存在x使得上式成立}
\end{cases}
\]

证明:

先不考虑a为0的情况。

已知 \((p-x)^2\equiv x^2\pmod p\), 这是因为\(p^2-2xp+x^2\equiv x^2 \pmod p\)

所有有\(p-1\over 2\) 个不同的二次剩余,即\(1^2,2^2,\cdots,({p-1\over 2}) \pmod p\) (因为前一半和后一半相同了)

又\(a^{p-1}\equiv 1 \pmod p\), 可以写为\(({a^{p-1\over 2}-1})({a^{p-1\over 2}} + 1)\equiv 0\pmod p\)

上式中的前后两个因子,必须有一个为0,由\(Lagrangs's theorem\) 可知 k次多项式最多 k 个解,所以\(a^{p-1\over 2}-1\equiv 0\pmod p\) 有最多 \(p-1\over 2\)个解。

又\(x^2\equiv a\), 所以\(a^{p-1\over 2} \equiv (x^2)^{p-1\over 2} \equiv 1\pmod p\)

所以每一个平方剩余都可以使得第一个因子为0,非0平方剩余最少有\(p-1\over 2\)个,所以这与上面方程的解正好对应起来,也就是说使得\(a^{p-1\over 2}\equiv 1\)成立的\(a\) 都是\(p\) 的二次剩余。同理可知使得\(a^{p-1\over 2} \equiv -1\)成立的\(a\)都是\(p\)的非二次剩余。

2. 求解二次剩余

本题比较特殊,\(p\equiv 3\pmod 4\) ,那么根据上面推出来的

\[a^{p-1\over 2}\equiv1~\Rightarrow~ a^{p+1\over 2}\equiv x^2~\Rightarrow a^{p+1\over 4}\equiv x
\]

对于更一般的\(p\) , 可以参考: http://xbgjxt.swu.edu.cn/jsuns/html/jsuns/2019/1/201901009.htm

综述:

  1. 根据欧拉准则来判断是否有解
  2. 有解则求出原题中的x 与 y输出
  3. 无解则输出-1

标程代码:

  1. int t, p = 1000000007;
  2. //快速幂代码
  3. long long pow(long long x, long long y, long long p) {
  4. }
  5. int main() {
  6. cin >> t;
  7. for (int tt = 0; tt < t; tt++) {
  8. long long b, c;
  9. cin >> b >> c;
  10. long long d = (b * b - 4 * c) % p;
  11. if (d < 0) {
  12. d += p;
  13. }
  14. if (d != 0 && pow(d, (p - 1) / 2, p) != 1) {//如果无解,需要注意d为0的情况
  15. cout << -1 << ' ' << -1 << endl;
  16. } else {
  17. long long r = pow(d, (p + 1) / 4, p);
  18. long long x = (b + r) * pow(2, p - 2, p) % p;
  19. long long y = (b - r) * pow(2, p - 2, p) % p;
  20. if (x < 0)x += p;
  21. if (y < 0)y += p;
  22. if (x > y) swap(x, y);
  23. cout << x << ' ' << y << endl;
  24. }
  25. }
  26. }

自己的代码

  1. const ll mod = 1e9+7;
  2. ll pow_mod(ll a,ll i,ll n){
  3. if(i == 0)return 1 % n;
  4. ll tmp = pow_mod(a, i>> 1,n);
  5. tmp = tmp * tmp % n;
  6. if(i & 1)tmp = tmp * a % n;
  7. return tmp;
  8. }
  9. //红宝书模板代码,求解模p下二次剩余为a的解
  10. ll modsqr(ll a,ll n){
  11. if(a == 0)return 0;
  12. ll b,k,i,x;
  13. if(n == 2)return a % n;
  14. if(pow_mod(a,(n-1)/2,n) == 1){
  15. if(n % 4 == 3)//本题中只会进入下面这个case
  16. x = pow_mod(a,(n+1)/4,n);
  17. else{
  18. for(b = 1;pow_mod(b,(n-1)/2,n) == 1;b++);
  19. i = (n-1)/2;
  20. k = 0;
  21. do{
  22. i/=2;
  23. k/=2;
  24. if((pow_mod(a,i,n) * pow_mod(b,k,n) + 1) % n == 0)
  25. k += (n-1) / 2;
  26. }while(i % 2 == 0);
  27. x = (pow_mod(a,(i+1)/2,n) * pow_mod(b,k/2,n))%n;
  28. }
  29. if(x * 2 > n)x = n-x;
  30. return x;
  31. }
  32. return -1;
  33. }
  34. int main()
  35. {
  36. int T;cin>>T;
  37. while(T--){
  38. ll b,c;
  39. scanf("%lld%lld",&b,&c);
  40. ll q,a;
  41. a = ((b*b - c * 4)%mod + mod) % mod;
  42. q = modsqr(a,mod);
  43. if(q == -1){//无解情况
  44. puts("-1 -1");
  45. continue;
  46. }
  47. //很蠢的分了两种情况....其实乘一个2的逆元即可
  48. ll x = (q + b) / 2;
  49. ll y = mod + b - x;
  50. x = (x % mod + mod) % mod;
  51. y = (y % mod + mod) % mod;
  52. if((x * y) % mod == c){
  53. if(x > y)swap(x,y);
  54. printf("%lld %lld\n",x,y);continue;
  55. }
  56. x = (q + b + mod)/2;
  57. y = b - x;
  58. x = (x % mod + mod) % mod;
  59. y = (y % mod + mod) % mod;
  60. if((x * y) % mod == c){
  61. if(x > y)swap(x,y);
  62. printf("%lld %lld\n",x,y);continue;
  63. }
  64. puts("-1 -1");
  65. }
  66. return 0;
  67. }

参考资料:

https://en.wikipedia.org/wiki/Quadratic_residue

https://en.wikipedia.org/wiki/Euler's_criterion

2019牛客暑期多校训练营(第九场)B Quadratic equation (平方剩余)的更多相关文章

  1. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  2. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  3. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  4. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  5. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  6. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  7. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  8. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  9. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  10. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

随机推荐

  1. Java反编译反混淆神器 - CFR

    最近有大量jar包需要反编译后使用,但是由于jar包中的类被混淆过了,直接反编译以后的里面所有的变量都是一个名字.所以这里介绍一个反混淆神器:CRF. 不知道是不是官网的链接:http://www.b ...

  2. java进阶(29)--HashMap集合

    一.HashMap简介 1.HashMap底层是哈希表结构,类似字典,初始化如下: 2.哈希表结构: 是一个数组+单向链表的结构体 数组:查询效率较高,随机增删效率很低 单向链表:在随机增删方面效率较 ...

  3. vue 侦听器watch 之 深度监听 deep

    <template> <div> <p>FullName: {{person.fullname}}</p> <p>FirstName: &l ...

  4. 什么是开发中经常说的'POCO'

    什么是开发中经常说的'POCO'Posted By : 蓝狐Updated On : 2015-07-19在看一些EF的文章,经常提到POCO这个词,但是,有没有比较详细的说这个POCO是什么意思呢? ...

  5. MySQL全面瓦解18:自定义函数

    定义 我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求. 但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函 ...

  6. F4IF_INT_TABLE_VALUE_REQUEST选择屏幕自定义F4帮助

    今天在用 F4IF_INT_TABLE_VALUE_REQUEST函数写选择屏幕的自定义帮助的时候,发现了个问题,那就是 F4IF_INT_TABLE_VALUE_REQUEST中参数value_ta ...

  7. 使用Intelij 运行Android 程序导致的无法安装

    前几天的时候更换了开发工具开发Android ,终于不用忍受Android studio 的各种卡顿了.我决定使用一段时间Intelij 开发Android. 之前的程序代码在运行的时候也出现了异常, ...

  8. USB充电限流芯片,输出短路关闭,过压关闭

    PW1503,PW1502是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路保护.它具有超温保护以及反向闭锁功能. PW1503,PW1502采用薄型(1毫米)5针薄型SOT2 ...

  9. uni-app开发经验分享十一: uniapp iOS云打包修改权限提示语

    打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝.Apple的原则是,如果一个app想要申请用户同意某个隐私信息访问 ...

  10. Py-时间,随机,os,sys,jsonpickle序列化,shelve,xml模块

    内置模块 1.时间模块 第一:time.time()是时间戳 时间戳默认是 从1970年到现在过的秒数,是一个很长的数值它可以做时间的计算以及显示 第二:localtime() 获取当前的时间,按元组 ...