binaryPow 快速冪 二分冪

2021-10-03 18:30:36 字數 866 閱讀 5557

快速冪,二分冪

求a^b%m    a<10^9,b<10^6,m<10^9

兩個整數可能不超過int型範圍,但是相乘之後可能就超過了範圍

ll llpow(ll a,ll b,ll m)else

}

遞推版

每乙個十進位制的數都唯一存在乙個與之對應的二進位制01串

如 13  1101  13=8+4+1

那麼 a^13=a^(8+4+1)=a^8 * a^4 * a^1

b  1  2     4     8     16     32    .....

a  a  a^2   a^4   a^8   a^16   a^32

ll binarypow(ll a,ll b,ll m)

a=a*a %m;

b>>=1;

}return ans %m;

}

//2^13

//a^b%m

//13 1101

//13=8+4+0+1

//2^13=2^8 * 2^4 * 2^1

typedef long long ll;

//對特殊情況需要特判

//如果m==1 則任何正整數對1求餘 結果都為0

// 如果 a b的初始值可能比m大,最好先對m求餘後進入函式

if(m==1) ans=0;

binarypow(a%m,b%m,m);

ll binarypow(ll a,ll b,ll m)

a=a*a%m;

b>>=1;

} return ans%m;

}

二分快速冪

在a,b為整數時,若 b很大,如 b 10 25 的時候,我們就要進行優化。如果b是偶數,則可以看作 a b a b 2 2 如果b是奇數,則 a b a b 1 2 2。則有兩種方法,一種遞迴 dfs 一種迴圈,遞迴如下 int dfs int a,int b,int mod int temp d...

二分快速冪

題目 ac include includeusing namespace std long long pow long long a,long long b,long long mod 二分快速冪 int main long long n,m cin n m long long mod 100000...

二分快速冪

對於a b,普通的求法是用乙個迴圈一直乘b個a,這樣的方法對於某些題目來說可能顯得比較慢。二分快速冪是一種利用b的二進位制特徵來快速求a b的演算法。例如 a 2,b 35 則b的二進位制表示形式為100011 則 a b 2 32 2 2 2 1 有了這樣的思路之後,就不用迴圈b次了。假設b的二進...