具體模版參見
這三題的題面都是:
給出三個數a,b,p,求a^b%p的值
乍一看很簡單,每一輪都乘以b,然後%p, (每次相乘都%p是不會爆掉的)
#include #include using namespace std;
unsigned long long a,b,p;
int main()
} + 2^} + ... + 2^}" class="mathcode" src=""/>
將這個數用這種方法加起來,比幼兒園的小孩乙個個地加要快得多,o(n)直接優化成了o(
所以相乘的時候也是一樣的
如果我要求
所以原來要列舉11遍的現在只用枚3遍了
但是,問題來了
我該怎麼判斷要加上2的幾次方呢?
這就得讓二進位制登場了
拿11舉例,11的二進位制是1011,(從左往右數)第四位表示的是
所以11就是
所以每一輪都可以將指數的個位求出來,然後 右移去掉個位就ok了
但是,問題來了
怎麼求個位呢?
前面講到的與運算就派上用場了。
因為除非兩個數都是1, 才會返回1, 否則返回0, 所以直接將乙個數&1, 判斷的就是個位了,如果個位是1, 就返回1,如果個位是0, 就會返回0
至此,快速冪講解完畢了
int fast_multiply(int x, int y, int p)//代表x的y次方%p
return ans;
}
(別以為我會寫好主程式的) 演算法提高快速冪(快速冪演算法詳解)
問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...
快速冪演算法
在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得...
快速冪演算法
模運算 公式 a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n 要保證n是整數 要知道a mod n和b mod n都是比n小的 利用這些共識可以有效地防止溢...