quickpow || 快速冪

洛谷例題

推薦自行腦補:百度百科c++

若是  ,那麼 數組

前言:快速冪就是快速算底數的n次冪。其時間複雜度爲 O(log₂N), 與樸素的O(N)相比效率有了極大的提升。函數

拿題目樣例優化

Input :2 10 9ui

Output:7spa

210 % 9 = 7 沒毛病code

問題不大 那麼真正的問題是怎麼算這個blog

普通冪:廢物過程 可你有沒有發現這個很煩?ci

但是 算到264就炸了qwq (__int128啥的給我走開)get

b=2,p=10,k=9
2^1=2 2%9=2 
2^2=4 4%9=4 
2^3=8 8%9=8 
2^4=16 16%9=7 
2^5=32 32%9=5 
2^6=64 64%9=1
2^7=128 128%9=2
2^8=256 256%9=4
2^9=512 512%9=8
2^10=1024 1024%9=7

 

 


 

遞推冪:甚至還能夠在優化 成 bk-1%p*b

 

其實也就是遞推 這樣就好一丟丟吧 大數字的時候能夠這樣暫且優化一下(至少不容易爆精度)

也是比較有實用性的 orz 這樣就能夠獲得 

a[1] = b ;
    for (register int i=2;i<=k;i++) a[i] = a[i-1] % p * b ;

 

這樣不就是個遞推了嗎 海星 用數組只是好理解 並且不太會爆精度 不知道多少分(應該比較優秀的分數吧

b=2,p=10,k=9
2%9=2 
2*2%9=4 
4*2%9=8 
8*2%9=7 
7*2%9=5 
5*2%9=1
1*2%9=2
2*2%9=4
4*2%9=8
8*2%9=7

看圖 其實有一部分是循環節(我還複製了) 能夠經過循環節來處理加速(不建議萬一沒有循環節呢

mod:是時候叫出快速冪(超級飛俠)來幫忙了 每次遇到困難...(不玩梗了


快速冪:

快速冪代碼

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL quickpow (LL x , LL y , LL mod){ LL ans = 1;//自定義函數可做爲快速冪模型
    for ( ; y ; x = x * x % mod , y >>= 1) y & 1 ? ans = ans * x % mod : 0;
    return (LL) ans % mod ;
}
signed main() {
    LL b,k,p;
    cin >> b >> k >> p ;
    cout << b << '^' << k << " mod " << p << '=' << quickpow(b , k , p) << endl ;
    return 0;
}

這個代碼能夠做爲模板使用

(背就完事了哪那麼多話)

相關文章
相關標籤/搜索