题意:

传送门

已知\(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\),那么直接求解即可。

代码:

#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 5e4 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 131;
const ll MOD = 1e9 + 7;
using namespace std; ll ppow(ll a, ll b, ll mod){
ll ret = 1;
a = a % mod;
while(b){
if(b & 1) ret = ret * a % mod;
a = a * a % mod;
b >>= 1;
}
return ret;
}
struct TT{
ll p, d;
};
ll w;
TT mul_er(TT a, TT b, ll mod){
TT ans;
ans.p = (a.p * b.p % mod + a.d * b.d % mod * w % mod) % mod;
ans.d = (a.p * b.d % mod + a.d * b.p % mod) % mod;
return ans;
}
TT power(TT a, ll b, ll mod){
TT ret;
ret.p = 1, ret.d = 0;
while(b){
if(b & 1) ret = mul_er(ret, a, mod);
a = mul_er(a, a, mod);
b >>= 1;
}
return ret;
}
ll legendre(ll a, ll p){
return ppow(a, (p - 1) >> 1, p);
}
ll modulo(ll a, ll mod){
a %= mod;
if(a < 0) a += mod;
return a;
}
ll solve(ll n, ll p){ //x^2 = n mod p
if(n == 0) return 0;
if(n == 1) return 1;
if(p == 2) return 1;
if(legendre(n, p) + 1 == p) return -1; //无解
ll a = -1, t;
while(true){
a = rand() % p;
t = a * a - n;
w = modulo(t, p);
if(legendre(w, p) + 1 == p) break;
}
TT temp;
temp.p = a;
temp.d = 1;
TT ans = power(temp, (p + 1) >> 1, p);
return ans.p;
}
bool getans(ll sum, ll dec, ll &x, ll &y){
if((sum + dec) % 2 == 0){
y = (sum + dec) / 2;
x = y - dec;
if(x >= 0 && x + y == sum && y < MOD) return true;
else return false;
}
else return false;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
ll b, c;
scanf("%lld%lld", &b, &c);
ll d = solve((b * b % MOD - 4 * c % MOD + MOD) % MOD, MOD);
if(d == -1){
printf("-1 -1\n");
continue;
}
ll x, y;
if(getans(b, d, x, y)){
printf("%lld %lld\n", x, y);
}
else if(getans(b + MOD, d, x, y)){
printf("%lld %lld\n", x, y);
}
else if(getans(b, MOD - d, x, y)){
printf("%lld %lld\n", x, y);
}
else if(getans(b + MOD, MOD - d, x, y)){
printf("%lld %lld\n", x, y);
}
}
return 0;
}

最新文章

  1. EAN
  2. spread 程序调试时,未激活的提示解决
  3. 3.1 哈尔空间 V0
  4. css 文本溢出显示省略号
  5. js017-错误处理与调试
  6. 洛谷P1108 低价购买
  7. [Node.js] Using ES6 and beyond with Node.js
  8. 记忆化搜索 dp学习~2
  9. Cocos2D中屏幕分辨率解释
  10. python之zip打包
  11. Oracle常用sql命令
  12. Qt QLineEdit
  13. 【bzoj3589】动态树 树链剖分+树链的并
  14. 潭州课堂25班:Ph201805201 django 项目 第二十六课 docker简介 (课堂笔记)
  15. ES 5 中 判断数组的方法
  16. Entity Framework学习初级篇2
  17. Python 字符串中 startswith()方法
  18. i2c_client 几种实例化方法
  19. 【转】Java中的多线程学习大总结
  20. IE每次关闭都提示IE已停止工作

热门文章

  1. 【MYSQL】DDL语句
  2. MySQL中UPDATE语句里SET后使用AND的执行过程和结果分析
  3. 基于Abp React前端的项目建立与运行——React框架分析
  4. MySQL设计之Schema与数据类型优化
  5. 容器调度 • Docker网络 • 持续交付 • 动态运行应用程序 部署的多元化
  6. dotnet .NET
  7. cookie中的domain和path
  8. Python基础(列表中变量与内存关系)
  9. 理解和运用 ClassLoader 该篇文章就够了
  10. CF1190B