<div>二次剩余模素数</div>

Rust Medium math

任务 «<div>二次剩余模素数</div>»

给定一个素数 p (p > 2) 和一个整数 a (0 ≤ a < p)。需要判断 a 是否为模 p 的二次剩余,即是否存在整数 x,使得 x^2 ≡ a (mod p)。如果 a 是二次剩余,则输出任意一个这样的 x (0 ≤ x < p)。如果不是,则输出 -1。请使用勒让德符号和 Tonelli-Shanks 算法,或在限制条件下使用枚举法。

输入格式

第一行包含两个整数:p(素数,3 ≤ p ≤ 10^9)和 a(0 ≤ a < p)。

输出格式

输出一个整数:x (0 ≤ x < p),满足 x^2 ≡ a (mod p),如果无解则输出 -1。

示例

示例 1

输入
7 2
输出
4

示例 2

输入
7 apple banana apple cherry banana apple date
输出
-1

示例 3

输入
7 3
输出
-1

示例 4

输入
4 aa a aaa a
输出
-1

示例 5

输入
13 4
输出
11
main.rs