zoukankan      html  css  js  c++  java
  • 快速幂

    快速幂

    a^b%p=??

     暴力O(b)      当然不可以!!
     
    两种解决思路: 
    • 分治
    • 快速幂
     
     
     

    快速幂(正常操作)

    举个例子:

    计算

    a^7      把它拆分:a^7 = a^1 * a^2 * a^4
    a^11    把它拆分:a^11 = a^1 * a^2 * a^8
    a^25    把它拆分:a^25 = a^1 * a^8 * a^16
     
    首先计算出 a^1、 a^2、 a^4、 a^8 …
     
    观察后发现可以把那要计算的幂分解成二次方的形式,如果b是奇数的话,最后乘以单个a就好啦
     

    代码:

    int quickpow(int a,int b,int n)
    {
        int ans=1;
    
        while(b)
        {
            if(b%2==1)
            ans=ans*a%n;
            a=a*a%n;
            b/=2;
        }
    
        return ans;
    }

     强烈安利,因为好写 

    分治

    比如求3^5

    也就是由3^2 , (3^2)^2 , 最后(3^2)^2*2得来

    。。。其实就是递归了一下。。。和上面的方法没有本质区别

    代码:

    int calc(int a,int b,int c)
    {
        if(b==1)  return a;
    
        int tmp=calc(a,b/2,c);
    
        tmp=tmp*tmp%c;
    
        if(b%2==1)  tmp=tmp*a%c;
    
        return tmp;
     } 
  • 相关阅读:
    第七周总结
    第六周编程总结
    第五周编程总结
    选择加冒泡排序法与找鞍马之总结与感受
    上三角矩阵与数组中元素之和最大
    文件的读写
    打印沙漏
    第八周作业
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10656921.html
Copyright © 2011-2022 走看看