[學習筆記]快速冪&&快速乘
阿新 • • 發佈:2018-10-01
就是 生成 tar 二進制 code 二進制拆分 div org 隨機
本質:二進制拆分。然後是一個配湊。
合起來就是邊二進制拆分,邊配湊。
快速乘(其實龜速):把乘數二進制拆分。利用乘法分配率。
用途:防止爆long long
代碼:
ll qk(ll x,ll y,ll mod){
ll ret=0;
while(y){
if(y&1) (ret+=x)%=mod;
(x+=x)%=mod;
y>>=1;
}
return ret;
}
如果為了卡常,可以寫成這樣:
ll qk(ll x,ll y,ll mod){
ll ret=0;
x %=mod;y%=mod;
while(y){
if(y&1) ret=ret+x>=mod?ret+x-mod:ret+x;
x=x+x>=mod?x+x-mod:x+x;
y>>=1;
}
return ret;
}
第一行必須有x%=mod,y%=mod,否則開始x,y可能很大,減一次mod不能減到mod以下。
還是錯過幾次。。。
(有時候卡這個取模還是挺有效的。)
快速冪(真的快速):把指數二進制拆分。利用:a^(x+y)=a^x*a^y
用途:各種指數運算,一般還取模。
推廣:矩陣快速冪。
代碼略。
快速冪經常與快速乘結合。log^2n也是可以接受的。
例題:
隨機數生成器
直接推式子,然後分治求等比數列,爆long long,要快速乘。
復雜度:O(log^3n)
[學習筆記]快速冪&&快速乘