1. 程式人生 > >[學習筆記]快速冪&&快速乘

[學習筆記]快速冪&&快速乘

就是 生成 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)

[學習筆記]快速冪&&快速乘