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

    在OI中,我们有时需要快速算出ab,那么怎么算呢,循环乘吗,显然,当a和b都很大时,这种算法十分的

    耗时,因此我么引入一个简单的数学知识——快速幂。


    让我们先引入一个问题:

    给定a,b,k,要求快速求出ab%的值。

    快速幂就是适用于这种问题的一个方法,其主要运用了分治的思想,试想ab难求,那么我们为什么不先

    算出ab/2呢,显然,ab=ab/2*ab/2,这样我们是不是就节省了一半的时间复杂度呢,这么一直分治下去,

    如果分到b=1了,那么就返回a即可。同时运用随时取模性质,我们在每次计算ab/2*ab/2时,都取一下膜,

    防止溢出,但还存在一个问题,就如果幂是奇数该怎么办QWQ?一样啊,奇数次幂与偶数次幂的差别就

    少乘或多乘一个a而已,因为C++中整形运算向下取整,所以对于奇数次幂的运算,我们就计算ab/2*ab/2*a

    即可。

     1 inline long long quickpow(long long a,long long b,long long k)
     2 {
     3     if(k==0) return 1;
     4     if(k==1) return a;
     5     if(k%2==0)
     6     {
     7         long long t=quickpow(a,b/2,k);
     8         return t*t%k;
     9     } 
    10     if(k%2!=0)
    11     {
    12         long long t=quickpow(a,b/2,k);
    13         return t*t%k*a%k;
    14     }
    15 } 
  • 相关阅读:
    3.K均值算法
    2.机器学习相关数学基础
    机器算法第一次作业
    语法制导的语义翻译
    算符优先分析
    自下而上语法分析
    LL(1)文法的判断,递归下降分析程序
    消除左递归
    DFA最小化,语法分析初步
    词法分析程序的设计与实现
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11381297.html
Copyright © 2011-2022 走看看