本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文适用于求x的y次方并对结果对z取模(当x,y,z都非常大时)
此时如果直接对x的y次方进行计算会花费大量的时间,这时候为了节省时间就引出了我们的快速幂算法.
快速幂算法的核心思想:讲底数平方,同时将指数除二。
简化过程:
在进行简化时首先判断指数是奇数还是偶数。
①假设是偶数将底数平方将指数除以二。例如:
4^8=16^4;按照这个方法继续代还为256^26=65536;
②当指数为奇数时就要想办法将指数转化为偶数,然后按照上述逻辑继续简化。例如2^9=2^8×2=4^4×2=16^2×2=256×2=512;
这样就可以大大减小计算量 ,降低时间复杂度。
关于mod:
对于求余(MOD,%)我们可以知道:
(a + b) mod k = (a mod k + b mod k) mod k
(a - b) mod k = (a mod k - b mod k + k) mod k
(a * b) mod k = ((a mod k ) * (b mod k)) mod k
而(a / b) mod k 需要用到乘法逆元. 如下:
乘法逆元:如果满足 (b * b1 ) mod k = 1,则称最小的正整数解b1为b mod k 的乘法逆元。
而(a/b)mod k = (a * b1) mod k。
所以如果我们要求A的B次方的结果对C取模可以用一下模板:
算法模板:
#include <cstdio>\
#include <cmath>//#include<bits/stdc++.h>.万能头\
#include <cstring>//memcpy(HH,hh,sizeof(hh));赋值函数,将hh赋值给HH\
#include <iostream>//str.erase(std::remove(str.begin(), str.end(), 'k'), str.end());删除指定字符\
#include<algorithm>//排列函数next_permutation(a,a+4);\
#include<stack>\
#include<queue>\
using namespace std;\
long long mi(long long A,long long B,long long C){\
long long mid = 1;\
while(B){//质数不为零 \
if(B&1){//位运算判断奇偶 \
mid *= A;//结果乘当前底数 \
mid %= C;//\
}\
A *= A;//底数平方化 \
A %= C;\
B /= 2;//指数减少一倍 \
}\
\
return mid;\
}\
\
int main(){\
std::ios::sync_with_stdio(false);\
long long A,B,C;\
cin>>A>>B>>C;\
cout<<mi(A,B,C)<<endl;\
return 0;\
}