你理解快速幂吗?
快速冪用來求解什么問題?
用來計算ab % 1000這樣的問題。
a的b次方問題
引例
問題舉例:
保留后三位,則是取余1000.
兩種方法來求ab
第零種(陣亡):pow函數(shù)
pow(a,b)%1000,這樣過不了,是肯定的。
第二種:直接 (a*a)%1000的做法,這樣的時間復(fù)雜度是O(b)
取決于多少個a相乘。
思路:每計算1次a*a,就取余1000,這樣位數(shù)不會超過3位,不會因為數(shù)據(jù)太大越界。
代碼
#include<iostream> using namespace std;int main() {long long a,b;cin>>a>>b;int n=a;//臨時變量for(int i=1;i<b;++i)n=a*n%1000;cout<<n;return 0; }快速冪
第二種:快速冪
先說快速冪的時間復(fù)雜度O(logb),b是乘冪數(shù)。
a的b次方,我們把它強(qiáng)行拆分。
對于ab ,如果b太大(這里假定b是偶數(shù)),我們先計算a的b/2次方,
比如 a4=a2 *a2可以先計算a2,要計算a2先求a1
如果b是奇數(shù),則做如下處理 :取出一個a,剩余部分仍然是偶數(shù)形式。比如:a5=a2 *a2*a1
遞歸實(shí)現(xiàn)
代碼
#include<iostream> using namespace std; typedef long long ll;ll fastPow(ll a, ll b, ll m){if(b == 0)return 1;else if(b % 2 == 1)//奇數(shù)冪return a * fastPow(a, b - 1, m) % m;else{//偶數(shù)冪ll num = fastPow(a, b/2, m) % m;return num * num % m;} } //復(fù)雜度O(logn)int main() {ll a,b;const int digits=1000;cin>>a>>b;int result=fastPow(a,b,digits);cout<<result; }參考博客:寫的不錯https://blog.csdn.net/Harington/article/details/87602682
總結(jié)
- 上一篇: Leetcode113路径总和2
- 下一篇: 腾讯投资航空科技公司 上天是资本认