使用欧拉定理求逆元

欧拉函数

欧拉函数φ(n)(n∈N*)是小于等于n的正整数中与n互质的数的个数。

欧拉定理

对于任意互素的a和n,有图片说明

图片说明

所以可以通过快速幂欧拉函数来求逆元

欧拉函数模板
public static long euler(long n) {
    long res = n;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            res = res / i * (i - 1);
        }
        while (n % i == 0) {
            n /= i;
        }
    }
    if (n > 1) {
        res = res / n * (n - 1);
    }
    return res;
}
快速幂模板
public static long fastPow(long a, long b, long mod) {
    long res = 1;
    while (b > 0) {
        if (b % 2 == 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
AC代码
import java.util.Scanner;

public class Main {
    public static long euler(long n) {
        long res = n;
        for (int i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                res = res / i * (i - 1);
            }
            while (n % i == 0)
                n /= i;
        }
        if (n > 1) {
            res = res / n * (n - 1);
        }
        return res;
    }

    public static long fastPow(long a, long b, long mod) {
        long res = 1;
        while (b > 0) {
            if (b % 2 == 1) {
                res = res * a % mod;
            }
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        System.out.println(fastPow(a, euler(b) - 1, b));
    }
}