Quadratic equation

牛客多校九B

给定

$(x+y)\%mod=b$

$(x*y)\%mod=c$

求 $x,y$

二次剩余

求$((x-y)^{2})\%mod = (b\times b-4\times c)\%mod$

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=;
ll qp(ll a, ll b, ll c)
{
ll ans = ;
while (b)
{
if (b % == )ans = (ans*a) % c;
b /= ;
a = (a*a) % c;
}
return ans;
} ll p=mod;
ll w;//二次域的D值
bool ok;//是否有解 struct QuadraticField//二次域
{
ll x, y;
QuadraticField operator*(QuadraticField T)//二次域乘法重载
{
QuadraticField ans;
ans.x = (this->x*T.x%p + this->y*T.y%p*w%p) % p;
ans.y = (this->x*T.y%p + this->y*T.x%p) % p;
return ans;
}
QuadraticField operator^(ll b)//二次域快速幂
{
QuadraticField ans;
QuadraticField a = *this;
ans.x = ;
ans.y = ;
while (b)
{
if (b & )
{
ans = ans*a;
b--;
}
b /= ;
a = a*a;
}
return ans;
}
}; ll Legender(ll a)//求勒让德符号
{
ll ans=qp(a, (p - ) / , p);
if (ans + == p)//如果ans的值为-1,%p之后会变成p-1。
return -;
else
return ans;
} ll Getw(ll n, ll a)//根据随机出来a的值确定对应w的值
{
return ((a*a - n) % p + p) % p;//防爆处理
} ll solve(ll n)
{
ll a;
if(n==)
return ;
if (p == )//当p为2的时候,n只会是0或1,然后0和1就是对应的解
return n;
if (Legender(n) == -)//无解
ok = false;
srand((unsigned)time(NULL));
while ()//随机a的值直到有解
{
a = rand()%p;
w = Getw(n, a);
if (Legender(w) == -)
break;
}
QuadraticField ans,res;
res.x = a;
res.y = ;//res的值就是a+根号w
ans = res ^ ((p + ) / );
return ans.x;
} int main()
{
ll q;
scanf("%lld",&q);
ll a,b,n,ans1,ans2;
ll inv2=qp(,mod-,mod);
while (q--)
{ scanf("%lld%lld",&a,&b); ok = true;
n=(a*a%mod-*b%mod+mod)%mod; ans1 = solve(n); ans2 = p - ans1;//一组解的和是p
if (!ok)
{
cout<<-<<' '<<-<<'\n';
}
else
{
ll x=(ans1+a)%p*inv2%p;
ll y=(a-x+p)%p;
printf("%lld %lld\n", min(x,y),max(x,y) );
}
}
}

最新文章

  1. LineNumberReader类
  2. LIS LCS n^2和nlogn解法 以及LCIS
  3. 如何获取、下载、安装fortran编译工具ifort
  4. Ubuntu_14.04安装docker
  5. cygwin下安装hadoop0.20
  6. C#后台跳转
  7. mysql 索引B-Tree类型对索引使用的生效和失效情况详解
  8. Vue.js的从入门到放弃进击录(一)
  9. Python资料汇总(建议收藏)
  10. c++ 文件操作详解
  11. 要搞刷机!从它的尸体上踏过去!钢板云路由!WPR003N复活!成功启动OPENWRT
  12. 第二次JAVA作业
  13. Java小知识点总结
  14. WEB安全:Tomcat 只可通过域名访问,禁止通过 IP 访问
  15. WIN7系统怎样增加C盘空间
  16. 特殊符号 UNICODE编码
  17. b-树和b+树以及mysql索引
  18. 密码加密MD5,Bash64
  19. iphone6设置企业qq
  20. CentOS系统初始化---不断更新中

热门文章

  1. 基于 Timer是一种定时器工具
  2. 九、Zabbix-触发器
  3. 命令行模式和Python交互模式的区别
  4. [Git] 019 merge 命令的补充
  5. [转帖]华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz
  6. Redis 内存满了怎么办……
  7. 状态压缩dp相关
  8. 补充[BNDSOJ]小p的数列
  9. C++ 统计输入的句子有多少英文字母
  10. viewset的使用的方法