輸入三個數,求a的b次方,對c取模
快速冪取模的思路:
a對b取模就是得到a除以b的餘數,本題,取模就是取餘
引理:積的取餘等於取餘的積的取餘。
打個比方5的4次方對3取餘,先按正常思維計算5的4次方625,對3取模,625除3得208餘1,什麼是取餘的積再取餘呢,先用5對3取餘,得2,2的4次方為16,16再對3取餘,得5餘1,前後兩次取餘的結果都是1,以此證明公式
作者做這道題總共犯了三個錯誤,第乙個就是沒有考慮到型別溢位,先用for迴圈算出a的b次方的值,再對c取餘,當a和b的數過大時,資料型別就存不下了,如果使用引理,只不過減少了底數的大小,當b(指數)過大時依然會爆掉。
為了解決指數太大的問題,又用到了另乙個數學知識,
2的n次方等於2的2分之n次方乘以2的2分之n次方
打個比方就是2的8次方等於2的4次方乘以2的4次方,算不明白就把式子展開,自己比較一下幾個2相乘就行了
根據剛才的例子得出一種解題思路
int a , b ,c
final d = a;
if(b%2==0)}
else
a=a*d;
}
看不明白就自己設想幾個數,走一走,數學原理都在上面了
為什麼要判斷b(指數)的奇偶性呢,,舉個例子2的9次方,是不是等於2的4次方乘以2的4次方再乘以2的1次方,他就不能像偶數一樣直接拆了
上面**表面上看是對的,當b=10時他就錯了,自己腦袋走一下流程,你就知道錯在哪了,
現在要丟擲究極**了
long long mode(long long a, long long b, long long mode)
b /= 2;
a = (a * a) % mode; }
return sum;
}
終極**不是作者本人想出來的,在別的部落格上覆制的,但是因為我沒有讀懂他提供的解析,所以寫了這篇部落格,經過作者大哥的幫助,作者總算想明白了這道題,列出了在做題過程中犯的錯誤,和思考過程,不得不說人家的**是真的厲害,雖然數學原理都懂了,寫的這麼簡潔真不知道是怎麼想出來的,你覺得他這個錯了可以自己跑一跑。
快速冪 快速冪取模演算法
在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...
快速冪取模演算法
因為進製對個位不影響,積的取餘等於取餘的積取餘 includeint powermod int a,int b,int c return ans int main return 0 1.如果b是偶數,我們可以記k a2 mod c,那麼求 k b 2 mod c 就可以了。2.如果b是奇數,我們也可...
快速冪取模演算法
求ab c,其中a,b的值可能很大,導致ab的值long long都存不下 對於ab c 1.首先我們將b分解成如下表示 b b0 b1 21 bn 2n 其中的 b0,b1,bn 指的是對應b的二進位制表示法中對應位置的取值,1或者0 比如 6 110 b0 0,b1 1,b2 1 則ab可以表示...