快速幂求逆元

快速幂求逆元

给定 nai,pi,其中 pi 是质数,求 aipi 的乘法逆元,若逆元不存在则输出 impossible

注意:请返回在 0p1 之间的逆元。

乘法逆元的定义

若整数 bm 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/ba×x(modm),则称 xb 的模 m 乘法逆元,记为 $ b^{-1} \pmod m b b m m b^{m-2} b $ 的乘法逆元。

想法

题目中说了pi 是质数
可以通过快速幂算出来逆元

思路

b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,bm2 即为 b 的乘法逆元。

证明:

a/ba×x(modm)

a/ba×b1(modm)

1bb1(modm)

1b1×b(modm)

b1×b1(modm)

根据费马小定理

papap11(modp)

bm11(modm)

b×bm21(modm)

b×bm2b1×b1(modm)

b×bm2=b1×b

b1=bm2

x=bm2

所以

  1. bm互质的时候,逆元为bm2

  2. bm不互质(即bm的倍数)的时候,逆元不存在

b×x%m=0

x无论多少b都有因数m,因此逆元不存在

码来!

#include <iostream>
using namespace std;
typedef long long LL;

LL quickPow(int a, int b, int p)
{
    LL res = 1 % p;
    
    while(b)
    {
        if(b & 1) res = res * a % p;
        
        b >>= 1;
        
        a = a * (LL)a % p;
    }
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        int a, p;
        scanf("%d%d", &a, &p);
        
        if(a % p == 0) puts("impossible");
        else printf("%d\n", quickPow(a, p - 2, p));
        
    }
    return 0;
}

注意:快速幂算法只有当p是质数是才可以使用

posted @   MoyouSayuki  阅读(166)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
:name :name
点击右上角即可分享
微信分享提示