快速冪(51Nod1046 A^B Mod C) 51Nod1046 A^B Mod C
阿新 • • 發佈:2018-11-09
快速冪也是比較常用的,原理在下面用程式碼解釋,我們先看題。
51Nod1046 A^B Mod C
給出3個正整數A B C,求A^B Mod C。
例如,3 5 8,3^5 Mod 8 = 3。Input 3個正整數A B C,中間用空格分隔。(1 <= A,B,C <= 10^9) Output 輸出計算結果 Sample Input
3 5 8Sample Output
3
這裡開始我用的是int型,一直錯,因為a、b、c範圍比較大,所以中間可能溢位,後來用了long long才過。
#include<cstdio> #define ll long long ll quickpow(ll a,ll b,ll c){ ll ans=1; a=a%c; //先取模 while(b){ if(b&1) ans=ans*a%c; 如果b是奇數,我們就乘一次,使還剩下偶數次冪, b>>=1;//此處意思是b/2 a=a*a%c;//上面b/2以後就是說把底數平方了:3^8==9^4,就是這個意思。 } return ans; } int main() { ll a,b,c; scanf("%lld%lld%lld",&a,&b,&c); printf("%lld",quickpow(a,b,c)); }
上面的quickpow就是快速冪的標準摸版,也是最快的。
首先快速冪需要知道定理:積的取餘等於取餘的積的取餘。
所以我們不斷的取餘再相乘。