牛客多校第九场 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$
那么开个根号就能得到x-y,很容易就得出x和y了
在模q意义下对k开根号的方法就是找到w,使得$w*w$ $mod$ $q=k$
考虑模数q为奇质数的情况,可以用Tonelli-Shanks算法求解,这是一个概率算法,但是一般而言得出正确解的概率非常高,遇到类似问题套版即可。
#include<iostream>
#include<cmath>
#define MOD 1000000007
#define LL long long
using namespace std;
LL qpow(LL x,LL y,LL m){
//cal x^y%m
LL re = ;
while(y){
if(y & )//判断n的最后一位是否为1
re = (re * x) % m;
y >>= ;//舍去n的最后一位
x = (x * x) % m;//将a平方
}
return re % m;
}
class ModSqrt{
public:
LL power(LL x,LL y,LL m){
//cal x^y%m
LL re = ;
while(y){
if(y & )//判断n的最后一位是否为1
re = (re * x) % m;
y >>= ;//舍去n的最后一位
x = (x * x) % m;//将a平方
}
return re % m;
} LL normal_power(LL a,LL b){
LL re = ;
while(b){
if(b & )//判断n的最后一位是否为1
re = (re * a);
b>>= ;//舍去n的最后一位
a = (a * a);//将a平方
}
return re;
} LL inverse(LL a,LL m){
return power(a,m-,m);
} LL getn(LL p){
for(LL i=;i<p;i++){
if(power(i,(p-)/,p)==p-)
return i;
}
return -;
} int solve(LL a,LL p){ if(a==)return ;
if(power(a,(p-)/,p)==p-){
return -;
}
while(a<)a+=p;
while(a>p)a-=p;
LL n=getn(p);
bool finish=false;
LL t=;
LL s=p-;
while(!finish){
s=s/;
if(s%) finish=true;
else t+=;
}
LL b=power(n,s,p);
LL _a=inverse(a,p);
LL x[];
for(LL i=;i<;i++)x[i]=;
x[t-]=power(a,(s+)/,p);
for(LL i=;i<=t-;i++){
LL judge=power((_a*x[t-i]*x[t-i])%p,normal_power(,t-i-),p);
if(judge==){
x[t-i-]=x[t-i];
}else if(judge==p-){
x[t-i-]=(power(b,normal_power(,i-),p)*x[t-i])%p;
}
}
return x[]; }
}modsqrt;
int main(){
int t;
scanf("%d",&t);
while(t--){
LL b,c;
scanf("%lld %lld",&b,&c);
LL q=b*b%MOD-*c%MOD;
q=(q+MOD)%MOD;
LL sq=modsqrt.solve(q,MOD);
if(sq==-)printf("-1 -1\n");
else{
LL xx=sq+b;
LL yy=(b-sq+MOD)%MOD;
LL x=xx*qpow(,MOD-,MOD)%MOD;
LL y=yy*qpow(,MOD-,MOD)%MOD;
if(x>y)swap(x,y);
printf("%lld %lld\n",x,y);
}
}
return ;
}
牛客多校第九场 B Quadratic equation 模平方根的更多相关文章
- 2019牛客多校第九场B Quadratic equation(二次剩余定理)题解
题意: 传送门 已知\(0 <= x <= y < p, p = 1e9 + 7\)且有 \((x+y) = b\mod p\) \((x\times y)=c\mod p\) 求解 ...
- 牛客多校第九场 && 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 ...
- Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)
题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...
- 2018牛客多校第九场E(动态规划,思维,取模)
#include<bits/stdc++.h>using namespace std;const long long mod=1000000007,inv=570000004;long l ...
- 2019牛客多校第九场AThe power of Fibonacci——扩展BM
题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...
- 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线
题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...
- 牛客多校第九场 A The power of Fibonacci 杜教bm解线性递推
题意:计算斐波那契数列前n项和的m次方模1e9 题解: $F[i] – F[i-1] – F[i-2] = 0$ $F[i]^2 – 2 F[i-1]^2 – 2 F[i-2]^2 + F[i-3] ...
- 牛客多校第九场 E All men are brothers 并查集/组合论
题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...
- 牛客多校第九场 D Knapsack Cryptosystem 背包
题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...
随机推荐
- java中EL表达式怎么获取网站的根目录
${pageContext.request.contextPath} <a href="${pageContext.request.contextPath}/login.jsp&quo ...
- PHP ftp_fget() 函数
定义和用法 ftp_fget() 函数从 FTP 服务器上下载一个文件并保存到本地一个已经打开的文件中. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_fget(ftp ...
- Redis Cluster集群详介绍和伪集群搭建
1 什么是Redis-Cluster 为何要搭建Redis集群.Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系 ...
- CSS margin属性
例子: p{ margin:2cm 4cm 3cm 4cm; } 结果如下: margin-top是上外边距 margin-right是右外边距 margin-bottom是下外边距 margin-l ...
- Java门面模式(或外观模式)
门面模式(或外观模式)隐藏系统的复杂性,并为客户端提供一个客户端可以访问系统的接口. 这种类型的设计模式属于结构模式,因为此模式为现有系统添加了一个接口以隐藏其复杂性.门面模式涉及一个类,它提供客户端 ...
- js登陆验证错误不刷新页面
验证函数返回 false;返回到onclickonclick 其实也是一个函数.. 所以需要加 return;
- 制作 U 盘启动盘
制作 U 盘启动盘 这篇文章说的是 U 盘启动盘是如何运作的,同时有一个既能装 Windows 又能装 Linux 的 U 盘启动盘的例子. U 盘启动盘 当按下开机键后,电脑能启动我原本安装的操作系 ...
- 47-Ubuntu-系统信息-2-df和du查看磁盘和目录空间占用
序号 命令 作用 01 df -h disk free 显示磁盘剩余空间;-h以人性化的方式显示文件大小 02 du -h [目录名] disk usage 显示目录下的文件大小 注:显示磁盘信息的时 ...
- C语言之内存分配函数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /********* ...
- 三.Python数据类型详述
Python第三节数据类型详述 一.多变量赋值 python允许多变量赋值 多变量赋相同的值a = b = c = 1 多变量赋不同的值a, b, c = 1, 2, "fuckyou&qu ...