• 快速幂,逆元的求解


    875. 快速幂

    给定 n

    组 ai,bi,pi,对于每组数据,求出 abiimodpi

    的值。

    输入格式

    第一行包含整数 n

    接下来 n

    行,每行包含三个整数 ai,bi,pi

    输出格式

    对于每组数据,输出一个结果,表示 abiimodpi

    的值。

    每个结果占一行。

    数据范围

    1≤n≤100000

    ,
    1≤ai,bi,pi≤2×109

    输入样例:

    1. 2
    2. 3 2 5
    3. 4 3 9

    输出样例:

    1. 4
    2. 1

     

    1)迭代写法求快速幂

    1. /**
    2. * 1)迭代写法求快速幂
    3. */
    4. #include
    5. using namespace std;
    6. typedef long long LL;
    7. int qmi(int a,int b,int p)
    8. {
    9. int res=1;
    10. while(b)
    11. {
    12. if(b&1)
    13. res=res*(LL)a%p;
    14. b >>=1;
    15. a=(LL)a*a%p;
    16. }
    17. return res;
    18. }
    19. int main()
    20. {
    21. int n;
    22. cin >> n;
    23. while (n -- )
    24. {
    25. int a,b,p;
    26. cin >> a >> b >> p;
    27. cout << qmi(a,b,p) << endl;
    28. }
    29. return 0;
    30. }

     

    2)递归求快速幂

    1. /**
    2. * 2)递归求快速幂
    3. */
    4. #include
    5. using namespace std;
    6. typedef long long LL;
    7. int qmi(int a,int b,int p)
    8. {
    9. if(b==0)
    10. return 1;
    11. if(b&1)
    12. return (LL)a*qmi(a,b-1,p)%p; //注意这里需要强制转换一下,int会溢出
    13. else
    14. {
    15. LL temp=qmi(a,b/2,p);
    16. return temp*temp%p;
    17. }
    18. }
    19. int main()
    20. {
    21. int n;
    22. cin >> n;
    23. while(n--)
    24. {
    25. int a,b,p;
    26. cin >> a >> b >> p;
    27. cout << qmi(a,b,p) << endl;
    28. }
    29. return 0;
    30. }

    876. 快速幂求逆元

    给定 n

    组 ai,pi,其中 pi 是质数,求 ai 模 pi

    乘法逆元,若逆元不存在则输出 impossible

    注意:请返回在 0∼p−1

    之间的逆元。

    乘法逆元的定义

    若整数 b,m

    互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a×x(modm),则称 x 为 b 的模 m 乘法逆元,记为 b−1(modm)。
    b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,bm−2 即为 b

    的乘法逆元。

    输入格式

    第一行包含整数 n

    接下来 n

    行,每行包含一个数组 ai,pi,数据保证 pi

    是质数。

    输出格式

    输出共 n

    行,每组数据输出一个结果,每个结果占一行。

    若 ai

    模 pi

    的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible

    数据范围

    1≤n≤105

    ,
    1≤ai,pi≤2∗109

    输入样例:

    1. 3
    2. 4 3
    3. 8 5
    4. 6 3

    输出样例:

    1. 1
    2. 2
    3. impossible


     * 假设 a,b,m都是整数,m>1,且ab与1模m同余,则a与b互为模m的逆元。
     * 所以当m为质数的时候,a的m-2次方就是a模m的逆元。(费马小定理)。

    1. /**
    2. * 假设 a,b,m都是整数,m>1,且ab与1模m同余,则a与b互为模m的逆元。
    3. * 所以当m为质数的时候,a的m-2次方就是a模m的逆元。(费马小定理)。
    4. */
    5. #include
    6. using namespace std;
    7. typedef long long LL;
    8. int qmi(int a,int b,int p)
    9. {
    10. if(b==0)
    11. return 1;
    12. if(b&1)
    13. return (LL)a*qmi(a,b-1,p)%p; //注意这里需要强制转换一下,int会溢出
    14. else
    15. {
    16. LL temp=qmi(a,b/2,p);
    17. return temp*temp%p;
    18. }
    19. }
    20. int main()
    21. {
    22. int n;
    23. cin >> n;
    24. while (n -- )
    25. {
    26. int a,p;
    27. cin >> a >> p;
    28. if(a%p==0)
    29. cout << "impossible\n";
    30. else
    31. cout << qmi(a,p-2,p) << endl;
    32. }
    33. return 0;
    34. }

  • 相关阅读:
    【javaSE】初始类与对象
    重生奇迹通关恶魔广场攻略篇
    C语言系统化精讲(二):C语言初探
    ADAS可视化系统,让自动驾驶更简单 -- 入门篇
    互联网干洗店洗鞋店预约收衣下单软件
    嵌入式系统开发【深入浅出】 通讯基本概念
    前端面试题汇总个人笔记
    LED热仿真笔记
    springboot幼儿园幼儿基本信息管理系统设计与实现毕业设计源码201126
    【简单介绍下Debian常用命令】
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/126264876