快速幂

1.c++里面的<math>有pow(double a,  double  b)求a^b

a.不建议计算整数,最好计算浮点数

b.速度是log(b)

c.当a,b都为整数,b>10^8时,建议自己手写“优化的快速幂”

d.当b为负数时也建议用pow,而不是手写

 

2.二分快速幂

pw1是递归快速幂

pw2是循环快速幂(解析里面还有简易写法)

#include<iostream>
using namespace std;
long long pw(int a, int b, int k)
{
   long long res = 1;
   while(b)
   {
       if(b & 1)
       {
           res = res * a % k;
       }
       b >>= 1;
       a = 1LL * a*a%k;
   }
   return res;
}
int main()
{
    int a, b, k;
    cin >> a >> b >> k;
    cout << a<<"^"<<b<<" mod "<<k<<"="<<pw(a, b, k);
}
正确代码

洛谷模板

注 :a给的范围是2^31(int),那么a*a就会直接越界,所以不行,要用1LL*a*a或者long long

posted @ 2021-02-01 17:24  bear_xin  阅读(66)  评论(0)    收藏  举报