当我们遇到类似于求a*b%c这样的问题的时候,如果是a^b%c,当a^b这个数特别大的时候,以至于int范围存不下该值,那最后取模得到的值当然也是错的,这个时候就运用到快速幂取模算法,这种算法的时间复杂度是O(logn),效率非常快,也是常用的几种算法之一。
快速幂取模依赖于以下数学公式:
以及a*b%c = ((a%c)*(b%c))%c
用二分的思想把b分为奇数和偶数,再运用公式按步求解,每次运算的时候进行取模,就可以使得数据不会溢出。具体代码如下:
#include <iostream>
using namespace std;
class fast_exponentiation
{
public:
fast_exponentiation(int a, int b, int c)
{
this->a = a;
this->b = b;
mod = c;
}
__int64 get_ans()
{
__int64 temp = a%mod, ans = 1; //用temp来记录每次平方的值,ans用来记录最后的答案
while(b!=0)
{
if(b%2 != 0) //当b为奇数。如果b是偶数,最后也会进一次if。
{
ans = (ans*temp)%mod; //防止ans*temp溢出,进行取模
}
temp = (temp*temp)%mod; //平方时进行取模
b/=2;
}
return ans;
}
private:
int a, b, mod;
};
int main()
{
__int64 answer;
fast_exponentiation test(2,62,3);
answer = test.get_ans();
printf("%I64u\n", answer);
return 0;
}
448



被折叠的 条评论
为什么被折叠?



