為什么使用快速冪:
????????假設題目要求求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 998244353ll 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;
}