题目
给定 组 ,其中 是质数,求 模 的乘法逆元,若逆元不存在则输出 impossible
。
注意:请返回在 之间的逆元。
乘法逆元的定义
若整数 互质,并且对于任意的整数 ,如果满足 ,则存在一个整数 ,使得 ,则称 为 的模 乘法逆元,记为 。
存在乘法逆元的充要条件是 与模数 互质。当模数 为质数时, 即为 的乘法逆元。
输入格式
第一行包含整数 。
接下来 行,每行包含一个数组 ,数据保证 是质数。
输出格式
输出共 行,每组数据输出一个结果,每个结果占一行。
若 模 的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible
。
数据范围
,
输入样例:
3
4 3
8 5
6 3
输出样例:
1
2
impossible
解题
方法一:快速幂
逆元
定义
若整数 互质[1],且对于任意一个整数 ,如果满足 [2] ,则存在一个整数 ,使得 [3] 。称 为 在模 意义下的乘法逆元,记作 。
作用
在要除以一个数,再取模时,把除法变成乘法运算,然后再取模。
思路
根据逆元的定义,有: ;
两边同乘 得: ;
所以: ①;
根据费马小定理 :若 为质数且 互质,则 。
从上式 中拆出一个 得到: 。
结合①式得到: 。
综上,在 存在乘法逆元的条件下,求出 即为 在模 意义下的乘法逆元。
使用快速幂求解即可。
注意:题目虽然保证 为质数,但是并没有保证 互质,所以在算之前要判断逆元是否存在。
代码
import java.util.*;
import java.io.*;
public class Main {
static long quickPow(long base, long exp, long mod) {
long res = 1L;
while (exp > 0) {
if ((exp & 1) == 1) res = res * base % mod;
base = base * base % mod;
exp >>= 1;
}
return res;
}
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int n = (int) in.nval;
while (n-- > 0) {
in.nextToken();
int a = (int) in.nval;
in.nextToken();
int p = (int) in.nval;
System.out.println(a % p == 0 ? "impossible" : quickPow(a, p - 2, p));
}
}
}
评论区