今天在牛客遇到一道題華華教月月做數學
我看了一下題,發現是讓求a^b%p,我一看就知道應該是快速冪,就非常高興的開始寫起來,但是寫完的時候,發現連給的第二個樣例都過不去,才發現,原來爆long long 了。
我看了一下題解,又搜了一下網上的資料,發現快速冪的弊端就是容易爆longlong,所以還有一種可以解決爆longlong的方法,那就是龜速乘,所以就去學了一下,然後ac了。
借鑑的大佬部落格
快速冪模板
ll quick_pow
(ll a,ll b, ll p)
return res;
}
龜速乘模板
ll low_times
(ll a,ll b,ll p)
return res;
}
我的ac**
#include
#include
typedef
long
long ll;
using
namespace std;
ll low_times
(ll a,ll b,ll p)
return res;
}ll quick_pow
(ll a,ll b, ll p)
return res;
}ll a,b,p;
intmain()
return0;
}
二進位制真的神奇。
a>>=1 向右進一位。
例如 14的二進位制 1110;
向右進一位 111;
快速冪 龜速乘
快速冪 利用了二進位制的特性,話說二進位制真有用。還有個矩陣快速冪 時間複雜度 o log n 模板 ll quick pow ll x,ll y return ans 龜速乘 求快速冪時,當兩個1e9的數相乘時會爆掉long long,這時就有了龜速乘完美的避免了這個問題。你也可以手寫高精度解決這...
快速冪 快速乘
直接求解,需要迴圈b次。思路 將b轉化為二進位制。對應為1的次數的冪保留,只需要將保留的冪的結果進行乘積就是a b。class solution def fast self,a,b b bin b 2 res 1for i in b 1 if i 1 res res a a a return res...
快速乘,快速冪
老是忘記還是寫下來記錄一下 快速乘,和快速冪都是防止爆int,或long long,如果爆longlong可以選擇兩者結合,或者使用 int128 上網搜了還是不懂 例題 include iostream using namespace std int main b b 2 a a a m cout...