同余定理快速冪取模(無痛理解,超詳細,圖文)



//圖可能加載比較慢,請稍等
//
ps,絕對不是標題黨,這篇比我看過的同余定理快速冪取模文章都詳細 #include<bits/stdc++.h> using namespace std; #define ll long long const ll mod = 10000; //poww函數輸出(a^b)%mod的值 //不能取名為pow,因為已經有pow這個函數了 /* 算法原理簡介: 求一個(a^b)%mod的值(求a的b次方對mod取模的值),經常會遇到b很大的情況 比如說(2^10000)%3,哪怕是用long long類型也裝不下 但是好在數論中有同余定理這個東西,接下來會說明部分同余定理的原理和 用"指數對半法"來具體實現同余定理快速冪取模 首先(a*b)%mod==[(a%mod)*(b%mod)]%mod (在下圖中解釋,請看下圖) 然后...這東西還是用紙寫好描述,還是看完下圖再回來看吧 (如果已經看完下面的圖片,那你肯定可以一氣呵成的看懂下面的代碼 ,然后就學會了,多用幾次就好了) */ ll poww(ll a,ll b) { ll ans=1,base=a%mod;//手賤精神,沒事mod一次a,那么以后就可以用base代替a while(b)//只要b是>=1的, {//如果b是奇數,先提出一個base乘到ans中 if(b&1) ans=(ans*base)%mod;//b&1是位運算的知識(下圖有解釋) base=(base*base)%mod;//再把底數位置的base平方再mod b/=2;//舉例子7/2=3 , 6/2=2,所以當b為奇數時,把一個base提出去 //然后實際上b已經從7變成6,但是地板除法剛好適應這個這個過程,不用再特殊考慮 } return ans; } /* int pow(int x,int y) { int s=1; for(;y;y>>=1,x=(ll)x*x%P)if(y&1)s=(ll)s*x%P; return s; }///比賽時爭分奪秒版快速冪取模 //適用於比賽時間緊急,需要用最短的時間寫出來,那下面這種寫法就很適合 //一共才幾行 */

 第三張圖一直擺不正,將就着看吧...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM