zoukankan      html  css  js  c++  java
  • 数学--数论--快速乘法+快速幂

    1.快速幂(快速模幂)
    ①求a^b:

    int pow(int a, int k)  { 
        int ans = 1;
        while(k)  {
            if(k &1)  ans *= a;   //判断奇偶只用判断最后一位比取模快
            a *= a;
            k >>=1;		//比除法快多了
        }
        return ans;
    }
    ②求a^b%p
    
    int pow_mod(int a, int k,int mod)  { 
         int ans = 1%mod;
         while(k)  {
             if(k &1)  ans =(long long) ans*a%mod;  //防止在对P取模前溢出
             a = (long long)a*a%mod;
             k >>=1;  //比除法快多了
         }
         return ans;
     }
    例题:BZOJ1008
    2.快速乘法
    方法①
    
    long long quickMul(long long a,long long b,long long mod)
    {
        long long ans=0;
        while(b){
            if(b&1) ans=(ans+a)%mod;
            a=(a+a)%mod;  //(计算机加法比乘法快,a+a比a*2快)
            b>>=1;
        }
        return ans;
    }
    
    方法②:高效算法
    
    long long quickMul(long long a,long long b,long long mod)
    {
        a%=mod;
        b%=mod;
        long long  ans=0;
        while(b){
            if(b&1){
                ans+=a;
                if(ans>=mod)
                   ans-=mod;
            }
            b>>=1;
            a<<=1;
            if(a>=mod)  a-=mod;
        }
       return ans;
    }
    
    方法③:使用long double优化版
    
    long long quickMul(long long a,long long b,long long mod)
    {
        a%=mod;
        b%=mod;
        long long c=(long double) a*b/mod;
        long long ans=a*b-c*mod;
        if(ans<0) ans+=mod;
        else if(ans>=mod) ans-=mod;
        return ans
      }
    
  • 相关阅读:
    面试精选:链表问题集锦
    经典排序算法总结与实现 ---python
    Python高级编程–正则表达式(习题)
    Python面试题汇总
    Python正则表达式
    Linux下的Libsvm使用历程录
    在 linux(ubuntu) 下 安装 LibSVM
    过拟合
    百度历年笔试面试150题
    MATLAB 的数据类型
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798554.html
Copyright © 2011-2022 走看看