快速幂求逆元-C语言

快速幂求逆元

算法描述

快速幂求逆元是指对于一个数 a a a 和一个质数 p p p,求 a p a^p ap 的逆元,即 a − 1 a^{-1} a1

算法步骤

  1. 首先判断 a a a 是否为 p p p 的倍数,若是,则不存在逆元,输出 “impossible”。
  2. a a a 不为 p p p 的倍数,则利用快速幂求 a p a^p ap 的逆元。
  3. a p = a p a^p = a_p ap=ap,则 a − 1 = a p − 1 ⋅ p a^{-1} = a_p^{-1} \cdot p a1=ap1p
  4. 利用快速幂求 a p − 1 a_p^{-1} ap1 的逆元,即 a p − 1 = a p p − 2 a_p^{-1} = a_p^{p-2} ap1=app2
  5. 最后,输出 a − 1 = a p − 1 ⋅ p a^{-1} = a_p^{-1} \cdot p a1=ap1p

复杂度分析

  • 时间复杂度: O ( log ⁡ p ) O(\log p) O(logp),其中 p p p 为质数。
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码实现

#include <stdio.h>
typedef long long LL;

LL quick_exponent(LL a, LL b, LL mod) {
    LL ans = 1;
    
    while (b) {
        if (b & 1) ans = (ans * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    
    return ans;
}

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

输入输出样例

输入:
3
2 3
3 5
10 7


输出:
impossible
5
1

注意事项

  • 对于 a a a p p p 的倍数的情况,输出 “impossible”。
  • 对于 a a a 不为 p p p 的倍数的情况,输出 a − 1 a^{-1} a1

相关推荐

  1. 快速-C语言

    2024-03-20 16:20:05       20 阅读
  2. 矩阵C语言

    2024-03-20 16:20:05       34 阅读
  3. C++、分数取模

    2024-03-20 16:20:05       31 阅读
  4. c语言序后四位

    2024-03-20 16:20:05       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 16:20:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 16:20:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 16:20:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 16:20:05       18 阅读

热门阅读

  1. pushd cd

    pushd cd

    2024-03-20 16:20:05      19 阅读
  2. 从原理总结chatGPT的Prompt的方法

    2024-03-20 16:20:05       19 阅读
  3. C语言实现数据结构中的通讯录问题

    2024-03-20 16:20:05       15 阅读
  4. 【python】一些常用命令汇总(持续更新……)

    2024-03-20 16:20:05       23 阅读
  5. 第十四届蓝桥杯模拟赛(第三期)Excel表

    2024-03-20 16:20:05       19 阅读
  6. 【十五】【算法分析与设计】二分查询(3)

    2024-03-20 16:20:05       20 阅读