题意:

传送门

已知\(0 <= x <= y < p, p = 1e9 + 7\)且有

\((x+y) = b\mod p\)

\((x\times y)=c\mod p\)

求解任意一对\(x,y\),不存在输出\(-1\ -1\)。

思路:

由两式变化可得\((y - x)^2 = (b^2 -4c + p) \% p \mod p\),那么可以应用二次剩余定理解得\(y - x\)的值,我们可以知道\((x+y) = b\)或者\((x+y) = b + p\),那么直接求解即可。

代码:

  1. #include<map>
  2. #include<set>
  3. #include<queue>
  4. #include<stack>
  5. #include<ctime>
  6. #include<cmath>
  7. #include<cstdio>
  8. #include<string>
  9. #include<vector>
  10. #include<cstring>
  11. #include<sstream>
  12. #include<iostream>
  13. #include<algorithm>
  14. using namespace std;
  15. typedef long long ll;
  16. typedef unsigned long long ull;
  17. const int maxn = 5e4 + 5;
  18. const int INF = 0x3f3f3f3f;
  19. const ull seed = 131;
  20. const ll MOD = 1e9 + 7;
  21. using namespace std;
  22. ll ppow(ll a, ll b, ll mod){
  23. ll ret = 1;
  24. a = a % mod;
  25. while(b){
  26. if(b & 1) ret = ret * a % mod;
  27. a = a * a % mod;
  28. b >>= 1;
  29. }
  30. return ret;
  31. }
  32. struct TT{
  33. ll p, d;
  34. };
  35. ll w;
  36. TT mul_er(TT a, TT b, ll mod){
  37. TT ans;
  38. ans.p = (a.p * b.p % mod + a.d * b.d % mod * w % mod) % mod;
  39. ans.d = (a.p * b.d % mod + a.d * b.p % mod) % mod;
  40. return ans;
  41. }
  42. TT power(TT a, ll b, ll mod){
  43. TT ret;
  44. ret.p = 1, ret.d = 0;
  45. while(b){
  46. if(b & 1) ret = mul_er(ret, a, mod);
  47. a = mul_er(a, a, mod);
  48. b >>= 1;
  49. }
  50. return ret;
  51. }
  52. ll legendre(ll a, ll p){
  53. return ppow(a, (p - 1) >> 1, p);
  54. }
  55. ll modulo(ll a, ll mod){
  56. a %= mod;
  57. if(a < 0) a += mod;
  58. return a;
  59. }
  60. ll solve(ll n, ll p){ //x^2 = n mod p
  61. if(n == 0) return 0;
  62. if(n == 1) return 1;
  63. if(p == 2) return 1;
  64. if(legendre(n, p) + 1 == p) return -1; //无解
  65. ll a = -1, t;
  66. while(true){
  67. a = rand() % p;
  68. t = a * a - n;
  69. w = modulo(t, p);
  70. if(legendre(w, p) + 1 == p) break;
  71. }
  72. TT temp;
  73. temp.p = a;
  74. temp.d = 1;
  75. TT ans = power(temp, (p + 1) >> 1, p);
  76. return ans.p;
  77. }
  78. bool getans(ll sum, ll dec, ll &x, ll &y){
  79. if((sum + dec) % 2 == 0){
  80. y = (sum + dec) / 2;
  81. x = y - dec;
  82. if(x >= 0 && x + y == sum && y < MOD) return true;
  83. else return false;
  84. }
  85. else return false;
  86. }
  87. int main(){
  88. int T;
  89. scanf("%d", &T);
  90. while(T--){
  91. ll b, c;
  92. scanf("%lld%lld", &b, &c);
  93. ll d = solve((b * b % MOD - 4 * c % MOD + MOD) % MOD, MOD);
  94. if(d == -1){
  95. printf("-1 -1\n");
  96. continue;
  97. }
  98. ll x, y;
  99. if(getans(b, d, x, y)){
  100. printf("%lld %lld\n", x, y);
  101. }
  102. else if(getans(b + MOD, d, x, y)){
  103. printf("%lld %lld\n", x, y);
  104. }
  105. else if(getans(b, MOD - d, x, y)){
  106. printf("%lld %lld\n", x, y);
  107. }
  108. else if(getans(b + MOD, MOD - d, x, y)){
  109. printf("%lld %lld\n", x, y);
  110. }
  111. }
  112. return 0;
  113. }

2019牛客多校第九场B Quadratic equation(二次剩余定理)题解的更多相关文章

  1. 牛客多校第九场 B Quadratic equation 模平方根

    题意: 已知 $x+y$ $mod$ $q = b$ $x*y$ $mod$ $q = c$ 已知b和c,求x和y 题解: 容易想到$b^2-4c=x^2-2xy+y^2=(x-y)^2$ 那么开个根 ...

  2. 2019牛客多校第一场E ABBA(DP)题解

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

  3. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  4. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  5. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  6. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

  7. Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)

    题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...

  8. 2019牛客暑期多校训练营(第九场)Quadratic equation——二次剩余(模奇素数)

    题意:给定p=1e9+7,构造x,y使其满足(x+y) mod p = b,(x*y) mod p = c . 思路:不考虑取模的情况下, .在取模的意义下,,因为a是模p的二次剩余的充分必要条件为  ...

  9. [2019牛客多校第二场][G. Polygons]

    题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...

随机推荐

  1. [Usaco2007 Jan]Balanced Lineup 飞盘比赛

    题目描述 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行 ...

  2. matlab gui matlab gui 鼠标点击显示图像颜色值

    首先看看效果 ‍ 首先功能说明下,运行后通过myfile菜单打开一幅图片之后在axes中显示,由于要使用图片的放大缩小等功能将figure 的菜单栏与工具栏都一并打开了. 界面编程主要是callbac ...

  3. mysql的安装使用及其用户管理

    mysql的安装使用及其用户管理   一.mariadb安装 搭建yum源 [mariadb] name = MariaDB baseurl = http://mirrors.ustc.edu.cn/ ...

  4. JavaScript中函数的this指向!

    JavaScript的this的指向问题! 这是我自己敲的, 报错! <button>点击查看绑定事件的this指向!</button> <script> // 函 ...

  5. Django Full Coverage

    Django(个人推荐, 如果项目较大 需要协同开发, 建议使用django这种重量级框架, 如果类似于纯api的后端应用建议使用 flask, 轻量小巧 , 麻雀虽小五脏俱全) 1.Django是什 ...

  6. Tensorflow-交叉熵&过拟合

    交叉熵 二次代价函数 原理 缺陷 假如我们目标是收敛到0.A点为0.82离目标比较近,梯度比较大,权值调整比较大.B点为0.98离目标比较远,梯度比较小,权值调整比较小.调整方案不合理. 交叉熵代价函 ...

  7. 中文电子病历命名实体识别(CNER)研究进展

    中文电子病历命名实体识别(CNER)研究进展 中文电子病历命名实体识别(Chinese Clinical Named Entity Recognition, Chinese-CNER)任务目标是从给定 ...

  8. ASP.NET Core 5.0 MVC中的视图分类——布局视图、启动视图、具体视图、分部视图

    一.创建MVC应用程序 创建后的项目 二.(全局性)启动视图 _ViewStart.cshtml 顾名思义,就是在View开始执行之前执行,而且是每一个View, 它的预设内容是 @{ Layout ...

  9. React-Router browserHistory浏览器刷新出现页面404解决方案

    在React项目中我们经常需要采用React-Router来配置我们的页面路由,React-Router 是建立在 history 之上的,常见的history路由方案有三种形式,分别是: 1.has ...

  10. 树与图的DFS与BFS

    树的DFS 题目:https://www.acwing.com/problem/content/848/ 代码 #include<bits/stdc++.h> using namespac ...