數論之模運算+快速冪
阿新 • • 發佈:2021-08-09
模運算
/定義
取模運算為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進行取模,然後將它們相乘,最後再計算取模值。