为什么使用快速幂:
假设题目要求求a的b次方。
c/c++里并没有^运算符,所以我们第一时间可能想到使用for循环,将“a *= a”语句循环b次。但是这样时间复杂度为O(n),所以当b过大的时候,我们的程序将会非常慢,所以我们需要使用快速幂降低他的时间复杂度,时间复杂度为O(log2n)
快速幂写法:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
ll ksm(ll a, ll b)
{
//a = 2, b = 13
//2^{1101} 13=8+4+1 2^8*2^4*2^1 原理:位运算
ll res = 1;
while(b)
{
if(b&1)res = res * a % mod;//b&1等价于b%2!=0(位运算,依次比较b与1的二进制位)
a *= a%mod;//2^{2^n}
b >>= 1;//b>>=1等价于b/=2(位运算,将b的二进制右移一位)
}
return res%mod;
}
int main()
{
ll a, b;cin >> a >> b;
cout << ksm(a, b);
return 0;
}
时间复杂度说明:
例:a = 2, b = 13
遍历了4次:2^2, 2^4, 2^8, 2^16。每次都以2的倍数增长,即{log2n},当指数=16时,执行了4次