C++高速べき乗型取り+大数乗算型取り
ll qmul(ll x, ll y, ll mod) // , p * p LL ; O(1) ( )
{
ll ret = 0;
while(y) {
if(y & 1)
ret = (ret + x) % mod;
x = x * 2 % mod;
y >>= 1;
}
return ret;
}
ll qpow(ll a, ll n, ll mod)
{
ll ret = 1;
while(n)
{
if(n & 1) ret = qmul(ret, a, mod);
a = qmul(a, a, mod);
n >>= 1;
}
return ret;
}
いくつかの数が連続して最後に型を取る場合、各数字を先に型を取り、最後に型を取ることができ、すなわち、%は*に対して結合則を有する.しかし,型取りに用いる数自体が大きいと,上記の方法ではだめである.このとき,高速べき乗型取りの方法を参考にして,大数相乗型取りの効果を達成することができる.