• 快速幂:acwing 875. 快速幂


    给定 n� 组 ai,bi,pi��,��,��,对于每组数据,求出 abiimodpi����mod�� 的值。

    输入格式

    第一行包含整数 n�。

    接下来 n� 行,每行包含三个整数 ai,bi,pi��,��,��。

    输出格式

    对于每组数据,输出一个结果,表示 abiimodpi����mod�� 的值。

    每个结果占一行。

    数据范围

    1≤n≤1000001≤�≤100000,
    1≤ai,bi,pi≤2×1091≤��,��,��≤2×109

    输入样例:
    1. 2
    2. 3 2 5
    3. 4 3 9
    输出样例:
    1. 4
    2. 1
    难度:简单
    时/空限制:1.5s / 64MB
    总通过数:49440
    总尝试数:78073
    来源:模板题
    算法标签
    1. #include
    2. using namespace std;
    3. typedef long long LL;
    4. LL quickmi(LL base,LL mi,LL p)
    5. {
    6. LL res=1;
    7. while(mi)
    8. {
    9. if(mi&1) res=res*base%p;
    10. mi>>=1;
    11. base=base*base%p;
    12. }
    13. return res;
    14. }
    15. int main()
    16. {
    17. int n;
    18. scanf("%d",&n);
    19. while(n--)
    20. {
    21. LL a,b,p;
    22. scanf("%lld%lld%lld",&a,&b,&p);
    23. LL ans=quickmi(a,b,p);
    24. printf("%lld\n",ans);
    25. }
    26. return 0;
    27. }

    快速幂的思路如下:首先需要注意一件事情,每一次中间运算都要取模,主要是为了防止发生溢出错误。快速幂的运算步骤是,先判断指数是否是奇数,假设指数是奇数,我们把答案乘以当前的底数,答案初始值为1,这一步操作结束之后,我们把指数除以2,把底数平方,比如说最开始是4^5,我们先把答案更新为4,然后把指数5除以2变成2(向下取整),把底数4平方变成16,操作结束之后指数不是奇数,不需要更新答案,指数再次变为原来的一半,2变成1,底数平方,变成16^2,操作结束之后,指数1是奇数,把答案更新,乘以当前的底数16^2,变成4*16^2,指数除以2变成0,结束循环。返回答案,也就是快速幂的结果。

    主要利用的是指数可以拆成若干乘式的乘积,我们每一次把指数除以2,只需要把底数平方即可。注意考虑指数是奇数的情况,程序整除会向下取整。

  • 相关阅读:
    Python学习四:函数
    javaEE -8(9000字详解网络编程)
    LeetCode --- 1380. Lucky Numbers in a Matrix 解题报告
    关于技术人员成长的一些建议
    毕业季 | 在不断探索中拟合最好的自己
    深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用
    conda 克隆/复制 虚拟环境
    服务器数据恢复—Storwize V3700存储数据恢复案例
    VGG网络详解(实现猫猫和狗狗识别)
    【数据仓库设计基础(三)】数据集市
  • 原文地址:https://blog.csdn.net/L3102250566/article/details/134470165