正题

题目链接:https://www.luogu.com.cn/problem/P5491


题目大意

求解x2=N(modP)x^2=N(mod\ \ P)x2=N(mod  P)


解题思路

若aaa在模ppp意义下可以开根那么aaa就是ppp的二次剩余,定义
(ap)={1(a是p的二次剩余)−1(a是p的二次非剩余)0(p∣a)\binom{a}{p}=\left\{\begin{matrix}1(a是p的二次剩余)\\-1(a是p的二次非剩余)\\0(p|a)\end{matrix}\right.(pa​)=⎩⎨⎧​1(a是p的二次剩余)−1(a是p的二次非剩余)0(p∣a)​

那么如果gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1就有(ap)=ap−12\binom{a}{p}=a^{\frac{p-1}2{}}(pa​)=a2p−1​。

如果我们求x2=N(modp)x^2=N(\mod p)x2=N(modp)那么我们考虑先求一个(a2−N)p−12=−1(a^2-N)^{\frac{p-1}{2}}=-1(a2−N)2p−1​=−1,然后定义ω=a2−N\omega=\sqrt{a^2-N}ω=a2−N​,那么就有定理x=(a+ω)p+12x=(a+\omega)^{\frac{p+1}{2}}x=(a+ω)2p+1​,这里我们找aaa的时候只要随机就好了,因为ppp的二次有p+12\frac{p+1}{2}2p+1​个,期望很快就能找到一个合法的aaa。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll T,n,p,k,w;
struct complex{complex(ll xx=0,ll yy=0){x=xx;y=yy;}ll x,y;
};
complex operator+(complex &a,complex &b)
{return complex((a.x+b.x)%p,(a.y+b.y)%p);}
complex operator-(complex &a,complex &b)
{return complex((a.x-b.x+p)%p,(a.y-b.y+p)%p);}
complex operator*(complex &a,complex &b)
{return complex((a.x*b.x%p+a.y*b.y%p*w%p+p)%p,(a.x*b.y+a.y*b.x)%p);}
complex poweri(complex x,ll b){complex ans=complex(1,0);while(b){if(b&1)ans=ans*x;x=x*x;b>>=1; }return ans;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
bool check(ll a)
{return power(((a*a%p-n)%p+p)%p,k)==(p-1);}
int main()
{srand(31958);scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&p);if(!n){printf("0\n");continue;}if(p==2){printf("%lld\n",n);continue;}k=(p-1)>>1;if(power(n,k)==p-1){printf("Hola!\n");continue;}ll a=rand()%p;while(!check(a))a=rand()%p;w=((a*a%p-n)%p+p)%p;ll x1=poweri(complex(a,1),(p+1)/2).x;ll x2=p-x1;if(x1>x2)swap(x1,x2);if(x1!=x2)printf("%lld %lld\n",x1,x2);else printf("%lld\n",x1);}
}

P5491-[模板]二次剩余相关推荐

  1. 2019南昌网络赛 H. The Nth Item(广义斐波那契数列求通项公式模板)(二次剩余+分块)

    链接:https://nanti.jisuanke.com/t/41355 题意: Q个询问,每次求F(N),但是N要用上一次询问的结果得到. 思路: 1.直接矩阵快速幂求,再用map记一下答案,求过 ...

  2. 【算法讲18:二次剩余】勒让德符号 | 欧拉判别法 | Cipolla 算法

    [算法讲18:二次剩余] Source\mathfrak{Source}Source ⌈\lceil⌈二次剩余⌋\rfloor⌋与⌈\lceil⌈二次非剩余⌋\rfloor⌋ ⌈\lceil⌈二次互反 ...

  3. OI模板大全(普及~省选NOI)

    整理的算法模板合集: ACM模板 hhh刚从某位大佬的洛谷首页偷到了一个好玩的东西 大佬在这儿 自己对照了一下原来我还有这么多东西没有学呜呜呜我好菜 普及- 模板大全续表续表A并查集A快速幂-取余运算 ...

  4. 【学习笔记】OI模板整理

    CSP2019前夕整理一下模板,顺便供之后使用 1. 数据结构 1.1. 虚树 描述: 给定树上的\(k\)个关键点,构建出一棵虚树,只有关键点和任意两个关键点的LCA会被保留,且原树上的祖先关系和虚 ...

  5. 中高级数论 [欧拉函数线性筛,二次剩余]

    欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...

  6. 亿些模板【数论数学】

    文章目录 前言 数论数学模板 GCD exgcd 快速幂 线性推逆元 线性推逆元(非连续) 逆元求组合数 矩阵乘法 线性筛素数-埃氏筛 线性筛素数-线性筛 线性筛欧拉-埃氏筛 线性求欧拉 龟速乘 FF ...

  7. 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

    你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...

  8. jiedai算法模板合集(正在肝2021.8.15)

    文章目录 基础模板 常用板子 数学题常用板子 输出挂 fread快读 高精度 分数类 打表压缩 基数排序 杂项 数据结构 树状数组 一维树状数组 二维树状数组 线段树 主席树 线段树合并/裂开 吉司机 ...

  9. ACM-组合数学完全总结(知识点+模板)

    目录 排列 1.1不可重排列 1.2可重排列 1.3圆排列 1.4不尽相异元素全排列 1.5多重集的排列 组合 2.1不可重组合数 2.2可重组合 2.3不相邻组合 2.4多重集的组合 2.5常用组合 ...

最新文章

  1. Eclipse+Maven创建web项目
  2. FreeMarker 快速入门
  3. 使用vuex 进行组件之间的通讯
  4. linux opengl 实例,一篇文章入门Ubuntu的OpenGL开发
  5. [总结] 网络流经典建模
  6. [ERR0134] Requested Service is not available【转载】
  7. 图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)
  8. p3d gauge 尺寸问题
  9. winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析
  10. 大型网站技术架构(六)--网站的伸缩性架构(转)
  11. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
  12. BDFZOI 数论小结1(筛法、欧拉phi函数)
  13. centos7安装mysql教程详解(含常见问题的解决方案)
  14. 华为新机Mate30参数解析,这些参数你都知道是什么意思吗?
  15. 网络安全之uRPF技术
  16. C++多线程1——pthread
  17. 【初学大数据】CentOS7安装hadoop3.3.2完全分布式详细流程
  18. keras.datasets.imdb.py 源码分析
  19. 贵如油的春雨都是润物细无声的么?——记2021年首场大范围雷雨强对流天气
  20. Openwrt:LuCI入门(一)

热门文章

  1. java递归 treeview_treeview递归
  2. element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
  3. python tuple args_Python基本数据类型之tuple
  4. 计算机组成与结构PLA,计算机组成与结构.doc
  5. idea中右侧的Maven框消失了
  6. 如何将nodejs项目程序部署到阿里云服务器上
  7. [蓝桥杯2015初赛]手链样式-思维+next_permutation枚举(好题)
  8. Redundant Paths POJ - 3177(tarjan+边双连通分量)
  9. mysql数据库check命令_利用mysqlcheck命令快速修复mysql数据库
  10. 数据结构与算法--第一个只出现一次的字符