1. 程式人生 > 其它 >數論之模運算+快速冪

數論之模運算+快速冪

模運算

/定義

  取模運算為a除以m的餘數,記為:a mod m = a % m

取模的結果滿足0 ≤ a mod m≤ m-1,題目用給定的m限制計算結果的範圍。例如m=10,輸出結果為原數的個位

/性質

  加:( a + b ) mod m = (( a mod m ) + ( b mod m )) mod m

  減:( a - b ) mod m = (( a mod m ) - ( b mod m )) mod m

  乘:( a× b ) mod m = (( a mod m )× ( b mod m )) mod m

  注意:沒有除法!!

     ( a / b ) mod m =(( a mod m )/( b mod m )) mod m

  打個比方( 100 / 50 ) mod 20 = 2,(( 100 mod 20 )/( 50 mod 20 ))mod 20 = 0 ,但 2 ≠ 0


快速冪

直接上程式碼。。

ll fastpow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=(a*ans)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}

假設要計算, 當n很大時,例如n=1e9,如果直接計算,就會發現計算結果的數字太大,計算結果的時間複雜度也是O(n)。

為了降低時間複雜度,我們採用快速冪的方法,用二進位制表示n,然後將表示為多個2的指數冪的和

由於冪運算的結果非常大,常常會超過變數型別的最大值。因此,建議在運算過程中就對每一個a進行取模,然後將它們相乘,最後再計算取模值。