牛客多校第九场 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}$的时间遍历前一半物品 ...
随机推荐
- python制作坦克对战
创建子弹类 import pygame class Bullet(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__i ...
- Java开发常见基础题大全
1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. &&:短路与,如果第一个表达式为false时,第二 ...
- js过滤字符串中的html标签
var str = 'add<a>daad</a><p>fsdada</p>' str.replace(/<[^<>]+>/g, ...
- Magento站点优化方案
Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求.既然如此还是很自然 ...
- FS获取KERNEL32基址的三种方法
FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移 说明 000 指向SEH链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberD ...
- 兼容软件,Wine安装,Crossover安装,
EL6 (RHEL6 and SL6) Required packages for proper building of 32-bit Wine on 64-bit EL6 yum install - ...
- 第一次安装hadoop记录
需求是:安装hadoop连接远程hadoop文件系统.JDK和hadoop需要与集群版本一致 首先去官网下载hadoop http://archive.apache.org/dist/hadoop/c ...
- Jeecg中通过Spring_AOP+注解方式实现日志的管理
转载;https://blog.csdn.net/ma451152002/article/details/77234236 Jeecg中通过Spring_AOP+注解方式实现日志的管理 一.设计思路 ...
- 19、Linux命令对服务器内存进行监控
国际惯例,我们要知道什么是服务器的内存,内存有哪些作用.这里就不做过多介绍,Linux性能监控需要我们对底层要有一定的理解.下面我将会列出我常用的监控内存的工具. vmstat vmstat显示关于进 ...
- 7_springboot2.x开发热部署
概述:在开发中我们修改一个Java文件后想看到效果不得不重启应用,这导致大量时间花费,我们希望不重启应用的情况下,程序可以自动部署(热部署).有以下四种情况,如何能实现热部署. 1.模板引擎 在Spr ...